我正在尝试创建一个JDialog,就像Microsoft Word中的Symbol对话框一样,您可以通过选择Symbol…从插入菜单中选择。基本上,它是一个n x m (n和m直到运行时才知道)小按钮网格。我有这个工作的第一个版本很好地使用GridLayout。问题是,当您调整对话框的大小时(需要能够调整对话框的大小),按钮的大小也会发生变化。我需要按钮的大小保持不变。
但是我想改变包含按钮的网格的尺寸。例如,如果对话框变宽,但保持相同的高度,则行数应该减少,而列数应该增加。
我想到了几个方法来解决这个问题:
- 当对话框调整大小时,创建一个新的GridLayout并重新填充按钮。我要试试这个,看看它看起来如何,但这似乎是一个笨拙的方式来做它。
- 使用其他类型的布局,如FlowLayout。我尝试了一下,但是它把所有的n x m按钮放在一行中。我不想使用水平滚动条和按钮跑出右边缘。无论如何,它应该是一个二维的按钮网格。
解决这个布局问题的最好方法是什么?
用GridLayout创建一个按钮面板,并为其设置一个固定的大小(当然可以在运行时计算)。按钮面板应该包含在BoxLayout的面板中。
查看BoxLayout教程
Very Very基本示例:
public static void main(String[] args) throws Exception
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel buttonPanel = new JPanel();
JPanel containerPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(2,2));
buttonPanel.add(new JButton("1"));
buttonPanel.add(new JButton("2"));
buttonPanel.add(new JButton("3"));
buttonPanel.add(new JButton("4"));
buttonPanel.setPreferredSize(new Dimension(300, 400));
containerPanel.add(buttonPanel);
frame.getContentPane().add(containerPanel);
frame.pack();
frame.setVisible(true);
}
如果对话框变宽,但保持相同的高度,行数应该减少,而列数应该增加。
我在单列按钮上遇到了类似的问题,并发现MiGLayout
(第三方,在这里可用)在这方面简单有效。它有助于创建网格和设置按钮大小,尽管我花了一两天的时间来适应它的语法。
关键是设置按钮大小;当然,GridLayout
看起来像是一个布局的方式,好吧,一个网格。我没有测试过,但我怀疑内置的setXSize()
方法也会起作用。GridBagLayout
教程中有一些关于大小/定位的示例。
FlowLayout将是一种方式,但你可能有一些配置问题。父组件使用什么布局管理器?