2012-03-22 87 views
10

居中的JLabel我已經從JPanel衍生的面板。我有一個來自JLabel的自定義控件。我試圖在我的面板上將此自定義JLabel居中。在一個JPanel

我知道這樣做的唯一方法就是使用空佈局(setLayout(null)),然後計算自定義JLabel的setLocation()點,以便它在正確的位置。

定製JLabel物理從一個面板移動到該面板在這個應用程序,我相信位置以前在setLocation設置是影響的事情。但是,當我將它設置爲(0,0)時,組件會進入左上角。

BorderLayout不起作用,因爲當只提供1個組件並放置到BorderLayout.CENTER時,中央部分擴大以填充所有空間。

我切割並從另一個網站粘貼一個例子使用BoxLayoutcomponent.setAlignmentX(Component.CENTER_ALIGNMENT)。這也沒有用。

提到覆蓋面板的getInset()函數的另一個答案(我認爲這就是所謂的),但是這被證明是一個死衚衕。

到目前爲止,我正在使用一個帶有GridBagLayout佈局的面板,當我將自定義JLabel插入我的面板時,我會包含一個GridBagConstraints對象。雖然這效率很低。有沒有更好的方式來中心在我JPanelJLabel

+8

考慮開採的實際問題了咆哮。 – 2012-03-22 19:47:52

+0

哦,以後我使用的GridBagLayout與GridBagConstraints的方法事情看起來OK,如果我最小化,然後恢復主窗口。 – Shackleford 2012-03-22 19:55:00

+2

寫這整個咆哮的時間足以使輸入到谷歌「搖擺與佈局管理工作」,點擊官方擺動教程的第一擊,看視覺引導,決定BoxLayout的看起來很有希望,看到它做更多的例子以下你想要什麼(它包含兩個組件ISO單一個) – Robin 2012-03-22 22:01:34

回答

8

BoxLayout的是要走的路。如果你設置了一個X_AXIS的BoxLayout,嘗試組件前後分別增加水平膠水:

panel.add(Box.createHorizontalGlue()); 
panel.add(label); 
panel.add(Box.createHorizontalGlue()); 
7

忘記了Java標準庫中的所有佈局管理和使用MigLayout。根據我的經驗,與通常一起工作會更容易,完全符合您的期望。

下面是如何完成使用MigLayout後的結果。

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 

     // use MigLayout 
     panel.setLayout(new MigLayout()); 

     // add the panel to the frame 
     frame.add(panel); 

     // create the label 
     JLabel label = new JLabel("Text"); 

     // give the label MigLayout constraints 
     panel.add(label, "push, align center"); 

     // show the frame 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 

大部分只是樣板。關鍵是佈局約束:"push, align center"

align center告訴MigLayout將JLabel放置在其網格單元的中心。

push告訴MigLayout展開網格單元以填充可用空間。

+0

有一個很好的MigLayout備忘單可以在:http://migcalendar.com/miglayout/mavensite/docs/cheatsheet.html – ulmangt 2012-03-22 20:08:09

+0

您可以從這裏下載最新版本的MigLayout:http://www.migcalendar.com/miglayout /versions/4.0/miglayout-4.0-swing.jar – ulmangt 2012-03-22 20:09:49

+0

有趣!感謝您的提示,我將不得不爲未來記住這一點,但現在我希望保留在Java庫中。我仍然很新,想要學習。 – Shackleford 2012-03-23 07:36:50

23

套裝GridBagLayoutJPanel,把JLabel沒有任何GridBagConstraintsJPanelJLabel將居中

enter image description here

例如

import java.awt.*; 
import javax.swing.*; 

public class CenteredJLabel { 

    private JFrame frame = new JFrame("Test"); 
    private JPanel panel = new JPanel(); 
    private JLabel label = new JLabel("CenteredJLabel"); 

    public CenteredJLabel() { 
     panel.setLayout(new GridBagLayout()); 
     panel.add(label); 
     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       CenteredJLabel centeredJLabel = new CenteredJLabel(); 
      } 
     }); 
    } 
} 
+0

謝謝mKorbel,不僅發佈有用的信息,但如此徹底做。不幸的是,這使我陷入了同樣的情況,我出現了意外的行爲(放置我的JLabel後我的面板中沒有出現任何內容)。當我將你的例子塞進我的實際代碼中並使用一個虛擬的JButton時,JButton的位置是完美的。我甚至給JButton添加了一些設置來模仿我的自定義JLabel,它仍然有效,但是當我使用我的JLabel時?那是事情不起作用的時候。我不明白。有一些東西阻止我的JLabel做這些虛擬JButton做的事情。 – Shackleford 2012-03-23 07:28:33

13

Supose您JLabel被稱爲label,然後使用:

label.setHorizontalAlignment(JLabel.CENTER); 
+0

這絕對是一箇舊的帖子,但當重新審視Swing的新項目時,這絕對是最簡單的答案。爲什麼這不是標記的答案超出了我。 – Maxs728 2016-07-18 15:25:21

+0

這是錯誤的。它影響標籤內容的位置,而不是標籤在容器內的位置。 – Kroky 2018-01-23 21:49:24