2010-08-18 67 views
4

我想要一個有3個菜單的窗口,一個綁在左邊,另一個綁在中間,最後一個綁在右邊。就像這樣:Java/Swing:試圖讓BorderLayout和GridBagLayout搭配很好

-------------------------------------------- 
-toolbar1---------toolbar2---------toolbar3- 
-------------------------------------------- 
-           - 
- rest of the window does something here - 

我遇到的問題是,這是結果我得到:

-------------------------------------------- 
---------toolbar1toolbar2toolbar3----------- 
-------------------------------------------- 
-           - 
- rest of the window does something here - 

下面是一些示例代碼(編譯和顯示問題):

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class TestClass extends JFrame { 

    public TestClass() { 
     super("test"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 

     final JPanel upper = new JPanel(); 
     upper.setLayout(new GridBagLayout()); 
     final GridBagConstraints gbc = new GridBagConstraints(); 

     final JButton toolbar1 = new JButton("toolbar1"); 
     final JButton toolbar2 = new JButton("toolbar2"); 
     final JButton toolbar3 = new JButton("toolbar3"); 

     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.anchor = GridBagConstraints.WEST; 
     upper.add(toolbar1, gbc); 

     gbc.gridx = 1; 
     gbc.anchor = GridBagConstraints.CENTER; 
     upper.add(toolbar2, gbc); 

     gbc.gridx = 2; 
     gbc.anchor = GridBagConstraints.EAST; 
     upper.add(toolbar3, gbc); 

     add(upper, BorderLayout.NORTH); 

     final JPanel something = new JPanel(); 
     something.setBackground(Color.WHITE); 
     something.setPreferredSize(new Dimension(600, 600)); 
     something.repaint(); 
     add(something, BorderLayout.CENTER); 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     final TestClass test = new TestClass(); 
    } 
} 

我該如何解決它?我認爲通過在GridBagConstraints中設置anchor我會照顧它,但那不起作用。

回答

1

你忘了補充:

gbc.weightx = 1.0; 
gbc.weighty = 1.0; 

你改後的代碼如下所示:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class TestClass extends JFrame { 

    public TestClass() { 
     super("test"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 

     final JPanel upper = new JPanel(); 
     GridBagLayout gridbag = new GridBagLayout(); 
     upper.setLayout(gridbag); 
     GridBagConstraints gbc = new GridBagConstraints(); 

     final JButton toolbar1 = new JButton("toolbar1"); 
     final JButton toolbar2 = new JButton("toolbar2"); 
     final JButton toolbar3 = new JButton("toolbar3"); 

     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.anchor = GridBagConstraints.WEST; 
     upper.add(toolbar1, gbc); 


     gbc.gridx = 1; 
     gbc.anchor = GridBagConstraints.CENTER; 
     upper.add(toolbar2, gbc); 


     gbc.gridx = 2; 
     gbc.anchor = GridBagConstraints.EAST; 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     upper.add(toolbar3, gbc); 


     add(upper, BorderLayout.NORTH); 

     final JPanel something = new JPanel(); 
     something.setBackground(Color.WHITE); 
     something.setPreferredSize(new Dimension(600, 600)); 
     something.repaint(); 
     add(something, BorderLayout.CENTER); 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     final TestClass test = new TestClass(); 
    } 
} 

它的工作原理。

1

如果您的工具欄看起來像BorderLayout(WEST,CENTER,EAST),爲什麼不使用BorderLayout而不是GridBagLayout?

無論如何,如果您堅持使用GridBagLayout,請將toolbar2的weightx約束條件設置爲1.這告訴佈局管理器,如果有更多空間可用,它應該將其全部提供給toolbar2。

gbc.weightx = 1; 
    upper.add(toolbar2, gbc); 
    gbc.weightx = 0; 
+0

中間的面板被拉伸。我想保留每一個之間的空間。 – iceburn 2010-08-18 05:53:28

+0

使用權重,GridBagLayout不應拉伸中間面板。 – jackrabbit 2010-08-18 05:59:19

+0

好吧,我必須添加一個JPanel來環繞每一個,然後我失去了之前自動獲得的高度縮放比例。我可以手動設置高度,但似乎容易出錯。 – iceburn 2010-08-18 06:56:13