2009-10-08 71 views
0

如何將按鈕放在一起並排放置。我使用了gridBagLayout來設計佈局。問題在於按鈕距離彼此太遠。我試圖選擇CENTER作爲錨點,但這會使按鈕重疊。如果我使用WEST和EAST,則按鈕位置彼此相距太遠。並排放置按鈕

例如保存----------新模式,而不是保存NEW_PATTERN。

JButton bSave = new JButton("SAVE"); 
JButton bPattern = new JButton("NEW_PATTERN"); 
con = new GridBagConstraints(); 
con.anchor=GridBagConstraints.WEST; 
con.gridy = 3; con.gridx = 0;   
con.gridwidth = 1; con.gridheight = 1;  
con.insets= new Insets(2,5,2,2);   
m.setConstraints(bSave, con); 
c.add(bSave); 
con.weightx=1; 
con.gridy=3; con.gridx=0; 
con.anchor=GridBagConstraints.EAST; 
m.setConstraints(bPattern,con); 
c.add(bPattern); 

回答

1

感謝AKF,我已經放置的FlowLayout的GridBagLayout的內部解決了這個問題。

.... 
JButton bSave = new JButton("Save"); 
JButton bPattern = new JButton("New Pattern"); 
JPanel pContainer = new JPanel(); 
pContainer.setLayout(new FlowLayout(FlowLayout.CENTER)); 
pContainer.add(bSave); pContainer.add(bPattern); 
con = new GridBagConstraints(); 
con.anchor=GridBagConstraints.CENTER; 
con.gridy = 3; con.gridx = 0;   
con.gridwidth = 1; con.gridheight = 1;  
m.setConstraints(pContainer, con); 
c.add(pContainer); 
.... 
1

GridBagLayout是最複雜的佈局。如果你只是對齊幾個按鈕,我會推薦使用FlowLayout(默認)或BoxLayout。但是,如果您想要使用GridBagLayout,而不是調整錨點,請將gridx調整爲第二個按鈕的值爲1。此外,不知道爲什麼你有一個gridy 3而不是gridy 0(除非有其他代碼,你已經省略,使用gridy 0-2)。

0

爲什麼不在發佈新問題之前先閱讀舊帖子?

你在哪裏給了你上一篇文章中Swing教程的鏈接。因此,閱讀教程,試用這些示例,並使用適當的佈局管理器或佈局管理器組合來完成這項工作。

0

而不是GridBagLayout,GridLayout是一個簡單的解決方案。這是很容易設置:

JButton bSave = new JButton("SAVE"); 
JButton bPattern = new JButton("NEW_PATTERN"); 
JPanel panel = new JPanel(new GridLayout(1,2); // 1 row, 2 cols 
panel.add(bSave); 
panel.add(bPattern); 

編輯:

只是出於好奇,我與你原來的打打鬧鬧,發現一個組合允許僅使用的GridBagLayout的。它是不是比你原來很大的不同:

GridBagConstraints con = new GridBagConstraints(); 
con.anchor=GridBagConstraints.WEST; 
con.gridy = 3; 
con.gridx = 0;     
con.gridwidth = 1; 
con.gridheight = 1;   
con.insets= new Insets(2,5,2,2);   
m.setConstraints(bSave, con); 
c.add(bSave); 
con.weightx=0; 
con.gridy=3; 
con.gridx=1;//this is the big diff! 
con.anchor=GridBagConstraints.EAST; 
m.setConstraints(bPattern,con); 
c.add(bPattern); 
+0

是否有可能同時具有gridBagLayout和flowLayout? – Jessy 2009-10-08 02:08:02

+0

是和否:)一個'Container'只能有一個'LayoutManager'。但是,在GridBagLayout中,您可以添加'JPanels',這些'JPanel''可以使用他們自己的'LayoutManager',因此您可以在其中一個面板中使用'FlowLayout'。 – akf 2009-10-08 02:28:16

+0

謝謝akf,我已經用你的代碼解決了這個問題:-) ... – Jessy 2009-10-08 02:35:15

0

我建議你閱讀GridBagLayout的教程,因爲它是開箱即用的最先進的佈局管理器,並且使其它過時的過時。出於這些原因,這非常值得學習。如果你把它想象成一個網格,並且你必須得到的所有東西都是x和y座標,這就是你在代碼中遺漏的東西,它使得一切都變得簡單。你幾乎在那裏:)

混合佈局管理器通常是一個非常糟糕的主意,因爲它們在填充具有額外空間的容器時都略有不同。

@camickr 基於我的評論,人們應該使用GridBagLayout,因爲它是最靈活的一個,可以在任何情況下使用。只有一個應該導致簡單和可維護的可能。我也發現它很容易閱讀,因爲它是邏輯映射的。只有當你爲所有組件使用一個約束對象時,約束纔會改變,這顯然是一個壞主意。

+0

編寫最簡單,最易維護的代碼應該是目標。這意味着使用適當的佈局管理器來完成這項工作。這並不意味着強制每個佈局使用相同的佈局管理器。 GridBagLayout最初是由IDE使用的,因爲IDE的智能性不足以將GUI分解成更小的邏輯分組,導致複雜的非可維護代碼,其中更改一個約束會影響其餘約束。根據你的建議,每個人都應該使用GroupLayout,因爲它是IDE的最新專業佈局,結果只是一個很難讀,不可維護的代碼。 – camickr 2009-10-08 15:24:52

0

此代碼將按鈕並排放置在屏幕中央。

重點是:

constraints.fill = GridBagConstraints.NONE; - >使butons不擴大

constraints.insets。右= 0; - >使得按鈕並排站

constraints.insets.left = 0; - >使得按鈕並排站

constraints.weightx = 1 - >使得在至極按鈕細胞水平EXPANDO

constraints.anchor = GridBagConstraints.EAST; - >使得左鍵站在小區的

constraints.anchor = GridBagConstraints.WEST; - >品牌站在單元格左側的右鍵

public static void main(String args[]){ 
     JFrame frame=new JFrame(); 
     Container cont=frame.getContentPane(); 
     cont.setLayout(new GridBagLayout()); 

     GridBagConstraints constraints=new GridBagConstraints(); 
     constraints.insets.top=2; 
     constraints.insets.bottom=2; 
     constraints.insets.left=0;// increment to separate buttons 
     constraints.insets.right=0;// increment to separate buttons 
     constraints.fill=GridBagConstraints.NONE; 
     constraints.weightx=1; 
     constraints.gridy=0; 

     constraints.anchor=GridBagConstraints.EAST; 
     constraints.gridx=0; 
     cont.add(new JButton("Save"),constraints); 

     constraints.anchor=GridBagConstraints.WEST; 
     constraints.gridx=1; 
     cont.add(new JButton("New Pattern"),constraints); 

     frame.pack(); 
     frame.setVisible(true); 
    }