2011-04-18 71 views
5

我試圖用Java Layouts創建一個非常簡單的窗口。我有三個要素來安排:一個按鈕,一個進度條和一個標籤。該按鈕必須垂直居中,進度條必須佔滿全部寬度,並且標籤必須左對齊。請幫我理解BoxLayout對齊問題

下面是一些代碼(只是假設窗格是一個JFrame的內容窗格和按鈕,進度條和標籤之前已經創建):

BoxLayout layout = new BoxLayout(pane, BoxLayout.Y_AXIS); 
pane.setLayout(layout); 
button.setAlignmentX(Component.CENTER_ALIGNMENT); 
pane.add(button); 
progressBar.setAlignmentX(Component.CENTER_ALIGNMENT); 
pane.add(progressBar); 
label.setAlignmentX(Component.LEFT_ALIGNMENT); 
pane.add(label); 

當我測試的應用程序,我看到的一切錯位和搞砸了:按鈕和標籤是隨機縮進的,如果我調整窗口大小,縮進量會以一種奇怪的方式變化。 進度條看起來不錯(全寬)。

我只是不明白髮生了什麼事。你能給我一個線索嗎?

+0

就個人而言,我從不相信setAlignmentX或setAlignmentY,儘量避免他們因爲瘟疫,我也避免了佈局管理器是完全依賴他們。 – jfpoilpret 2011-04-18 13:21:16

+1

我現在理解你爲什麼這樣做。 ..你會建議什麼替代方案? – gd1 2011-04-18 13:22:57

+0

那麼,如果你必須堅持純JDK,那麼我可能會在你的情況下使用GridBagLayout;這將工作得很好,因爲你的佈局很簡單(當佈局有更多組件時,GBL開始變得複雜)。否則,我會使用DesignGridLayout。 – jfpoilpret 2011-04-18 13:30:22

回答

5

有時你需要有點創意並使用嵌套面板,但是我更喜歡這種方法,然後嘗試學習和記憶使用其他佈局管理器(GridBagLayout,GroupLayout)時需要使用的所有約束條件通過IDE的爲你生成代碼。

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

public class BoxLayoutVertical extends JFrame 
{ 
    public BoxLayoutVertical() 
    { 
     Box box = Box.createVerticalBox(); 

     JButton button = new JButton("A button"); 
     button.setAlignmentX(Component.CENTER_ALIGNMENT); 
     box.add(button); 

     JProgressBar progressBar = new JProgressBar(0, 100); 
     progressBar.setAlignmentX(Component.CENTER_ALIGNMENT); 
     box.add(progressBar); 

     JPanel panel = new JPanel(new BorderLayout()); 
     JLabel label = new JLabel("A label"); 
     label.setAlignmentX(Component.LEFT_ALIGNMENT); 
     panel.add(label); 
     box.add(panel); 

     add(box, BorderLayout.NORTH); 
    } 

    public static void main(String[] args) 
    { 
     BoxLayoutVertical frame = new BoxLayoutVertical(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setSize(300, 200); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

有史以來最好的解決方案,因爲沒有額外的庫,沒有額外的類,它是針對我面臨的問題而定製的。但是,我會遵循其他用戶的解決方案來了解更多關於佈局的信息,但在這種情況下,我正在尋找一種簡單的黑客攻擊手段。 – gd1 2011-04-18 17:15:03

1

也許你的代碼只是一個片段,但我錯過了一個電話pack()

手動編碼擺動佈局可能會非常令人沮喪的標準佈局管理器。爲此我使用MiG Layout。它非常簡單,只需幾行代碼即可完成佈局。如果你不是被迫使用BoxLayout,我建議你試試看。

+0

我喜歡這個MiG佈局,但我真的不想鏈接其他JAR,並將其推向更復雜的層次,以實現像這樣非常非常簡單的應用程序。 – gd1 2011-04-18 13:11:53

+0

@Giacomo:足夠公平;)「缺少」包()不是​​那麼問題呢? – 2011-04-18 13:13:55

+0

不,這不是...... – gd1 2011-04-18 13:22:16

1

請勿使用BoxLayout。它只適用於非常簡單的情況。

對於你的情況,我會建議GridBagLayout或(我最喜歡的)GroupLayout。


對於GroupLayout的,我創建了一個子類(LayoutHelper),還有一些實用的方法和有用的構造,這使得編寫佈局要容易得多。

當然,通常我會以同樣的方式對齊組中的所有組件,因此在簡單情況下它不會像your case那樣短。

LayoutHelper h = new LayoutHelper(pane); 

    h.setVerticalGroup 
     (h.sequential(button, progressBar, label)); 

    h.setHorizontalGroup 
     (((ParallelGroup)h.parallel()) 
      .addComponent(button, Alignment.CENTER) 
      .addComponent(progressBar) 
      .addComponent(label, Alignment.TRAILING)); 

下面是截圖:

screenshot

對於一個簡單的 「一切對準以同樣的方式」,水平組是這樣的:

h.setHorizontalGroup 
     (h.parallel (button, progressBar, label)); 

(任選指示對齊的第一個參數)。

+0

@Paulo you _hand-code_ GroupLayout?那麼你似乎有太多的業餘時間:-) – kleopatra 2011-04-18 13:40:02

+0

@kleopatra:我有一個包裝類,它有點輕鬆。 (我會加上它的樣子)。一個簡單的骨骼GroupLayout並不好,但並不比GridBagLayout好。 – 2011-04-18 14:17:03

+0

@Giacomo:坦率地說,我不知道BoxLayout的好處。我也有使用它的唯一問題,特別是與其佈局方向正交的對齊方式。 – 2011-04-18 14:18:32

2

來彌補我的評論原來的問題,下面是一個使用一個片段DesignGridLayout

JButton button = new JButton("Button"); 
JProgressBar progressBar = new JProgressBar(); 
JLabel label = new JLabel("Label"); 

// The interesting stuff is in the next 4 lines 
DesignGridLayout layout = new DesignGridLayout(getContentPane()); 
layout.row().center().add(button).withOwnRowWidth(); 
layout.row().center().fill().add(progressBar); 
layout.row().left().add(label); 

pack(); 

它究竟是幹什麼的回函描述你的問題,並且不需要任何組件的任何特定呼叫。

7

的BoxLayout不能處理不同的對準:見http://download.oracle.com/javase/tutorial/uiswing/layout/box.html

從文章引用:「。一般而言,所有由頂至底的BoxLayout對象控制的部件應具有相同的X對準。類似地,所有的部件由左向右控制Boxlayout通常應該具有相同的Y對齊。「

+0

謝謝,因此BoxLayout對我來說是廢話。我會遵循你的所有提示。 – gd1 2011-04-18 17:11:39

+0

你確定它不能處理不同的路線? http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html – 2014-04-04 10:07:03

+0

@AndrewS:當你建議Box可以處理不同的路線時,你指的是哪部分教程?該解決方案是否涉及使用Box.createHorizo​​ntalGlue(),或者這是否有可能? – mins 2014-11-13 07:45:18