2010-03-29 167 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。)