如何设置按钮的大小?
我把我的按钮与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试图使firstPanel
和secondPanel
相等的宽度!而且,Java试图填充窗口的所有高度。我怎样才能消除这种行为?
下面的代码位做你要求什么。只要确保你分配足够的空间,以便在按钮上的文字变为可见
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);
基本上我现在设置面板的首选尺寸和最小尺寸为框架。
尝试用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);
}
}
编译器写入它无法找到名为'setPreferredSize'的方法。 – Roman 2010-03-29 09:53:35
网格布局往往是不适合的按钮是最好的选择,尽管它可能是您的应用程序。一个很好的参考是tutorial on using Layout Managers。如果你看一下GridLayout示例,你会看到按钮看起来有点傻 - 太大了。
一个更好的想法可能是使用的FlowLayout您的按钮,或者如果你知道你想要什么,也许是的GroupLayout。 (Sun/Oracle recommend GroupLayout或GridBag布局比手动编码时优于GridLayout。)
我试过这段代码。有用。但是,如果我尝试在我的程序中实现相同的想法,它不起作用。我认为,原因是我包括我的JPanel(与GridLayout)到另一个JPanel(与BoxLayout.Y_AXIS)。@Roman – Roman 2010-03-29 11:31:24
如果你想要更具体的帮助,你需要发布一些示例代码! – Kris 2010-03-29 12:17:08
按要求,我发布了代码。 – Roman 2010-03-29 12:20:26