2010-03-29 90 views
23

我把我的按鈕與GridLayout的一個JPane。然後我把JPanel放到BoxLayout.Y_AXIS的另一個JPanel中。我希望GridLayout中的按鈕是方形的。我使用tmp.setSize(30,30),它不起作用。我也嘗試使用new GridLayout(X, Y, 4, 4)但我不能找出X和Y。那麼,做這件事的正確方法是什麼?如何設置按鈕的大小?

新增:

我還是解決不了問題。這裏是什麼,我試圖做的代碼:

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

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel firstPanel = new JPanel(); 
     firstPanel.setLayout(new GridLayout(4, 4)); 
     JButton btn; 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(100, 100)); 
       firstPanel.add(btn); 
      } 
     } 

     JPanel secondPanel = new JPanel(); 
     secondPanel.setLayout(new GridLayout(5, 13)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(40, 40)); 
       secondPanel.add(btn); 
      } 
     } 

     mainPanel.add(firstPanel); 
     mainPanel.add(secondPanel); 
     frame.add(mainPanel); 

     frame.setSize(400,600); 
     frame.setVisible(true); 
    } 
} 

的問題是Java試圖使firstPanelsecondPanel相等的寬度!而且,Java試圖填充窗口的所有高度。我怎樣才能消除這種行爲?

回答

28

下面的代碼位做你要求什麼。只要確保你分配足夠的空間,以便在按鈕上的文字變爲可見

JFrame frame = new JFrame("test"); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
JPanel panel = new JPanel(new GridLayout(4,4,4,4)); 

for(int i=0 ; i<16 ; i++){ 
    JButton btn = new JButton(String.valueOf(i)); 
    btn.setPreferredSize(new Dimension(40, 40)); 
    panel.add(btn); 
} 
frame.setContentPane(panel); 
frame.pack(); 
frame.setVisible(true); 

X和Y(該網格佈局構造的兩個第一參數)(分別)指定網格中的行和列數。如果你希望這個值是無限的,你可以將其中一個作爲0。

編輯

我修改所提供的代碼,我相信現在符合什麼期望:

JFrame frame = new JFrame("Colored Trails"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel mainPanel = new JPanel(); 
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

JPanel firstPanel = new JPanel(); 
firstPanel.setLayout(new GridLayout(4, 4)); 
firstPanel.setMaximumSize(new Dimension(400, 400)); 
JButton btn; 
for (int i=1; i<=4; i++) { 
    for (int j=1; j<=4; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(100, 100)); 
     firstPanel.add(btn); 
    } 
} 

JPanel secondPanel = new JPanel(); 
secondPanel.setLayout(new GridLayout(5, 13)); 
secondPanel.setMaximumSize(new Dimension(520, 200)); 
for (int i=1; i<=5; i++) { 
    for (int j=1; j<=13; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(40, 40)); 
     secondPanel.add(btn); 
    } 
} 

mainPanel.add(firstPanel); 
mainPanel.add(secondPanel); 
frame.setContentPane(mainPanel); 

frame.setSize(520,600); 
frame.setMinimumSize(new Dimension(520,600)); 
frame.setVisible(true); 

基本上我現在設置面板的首選尺寸和最小尺寸爲框架。

+0

我試過這段代碼。有用。但是,如果我嘗試在我的程序中實現相同的想法,它不起作用。我認爲,原因是我包括我的JPanel(與GridLayout)到另一個JPanel(與BoxLayout.Y_AXIS)。@Roman – Roman 2010-03-29 11:31:24

+0

如果你想要更具體的幫助,你需要發佈一些示例代碼! – Kris 2010-03-29 12:17:08

+0

按要求,我發佈了代碼。 – Roman 2010-03-29 12:20:26

5

嘗試用setPreferredSize而不是setSize

UPDATE:GridLayout佔用所有空間在它的容器中,並BoxLayout接縫佔用所有的寬度在其容器,所以增加了一些膠合面板是不可見的,只是佔用空間,當用戶伸展的窗口。我剛剛做了這個水平,而不是垂直,但你可以用相同的方式實現,如果你想要它。

由於GridLayout使相同大小的所有單元格,如果他們有一個指定的大小沒關係。您必須像我一樣爲其容器指定大小。

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

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel firstPanel = new JPanel(new GridLayout(4, 4)); 
     firstPanel.setPreferredSize(new Dimension(4*100, 4*100)); 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       firstPanel.add(new JButton()); 
      } 
     } 

     JPanel firstGluePanel = new JPanel(new BorderLayout()); 
     firstGluePanel.add(firstPanel, BorderLayout.WEST); 
     firstGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     firstGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     JPanel secondPanel = new JPanel(new GridLayout(13, 5)); 
     secondPanel.setPreferredSize(new Dimension(5*40, 13*40)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       secondPanel.add(new JButton()); 
      } 
     } 

     JPanel secondGluePanel = new JPanel(new BorderLayout()); 
     secondGluePanel.add(secondPanel, BorderLayout.WEST); 
     secondGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     secondGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     mainPanel.add(firstGluePanel); 
     mainPanel.add(secondGluePanel); 
     frame.getContentPane().add(mainPanel); 

     //frame.setSize(400,600); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

編譯器寫入它無法找到名爲'setPreferredSize'的方法。 – Roman 2010-03-29 09:53:35

2

網格佈局往往是不適合的按鈕是最好的選擇,儘管它可能是您的應用程序。一個很好的參考是tutorial on using Layout Managers。如果你看一下GridLayout示例,你會看到按鈕看起來有點傻 - 太大了。

一個更好的想法可能是使用的FlowLayout您的按鈕,或者如果你知道你想要什麼,也許是的GroupLayout。 (Sun/Oracle recommend GroupLayout或GridBag佈局比手動編碼時優於GridLayout。)