3

我正在尝试创建一个 JDialog,类似于 Microsoft Word 中的 Symbol 对话框,您可以通过从Insert菜单中选择Symbol...来获得该对话框。基本上,它是一个n x mnm直到运行时才知道)小按钮网格。我有一个使用 GridLayout 很好地工作的第一个版本。问题是当您调整对话框的大小时(并且要求您应该能够调整它的大小),按钮的大小会发生变化。我需要按钮的大小保持不变。

但我希望包含按钮的网格的尺寸发生变化。例如,如果对话框变宽,但高度保持不变,则行数应该减少,而列数会增加。

我想了几种方法来解决这个问题:

  1. 当对话框调整大小时,创建一个新的 GridLayout 并用按钮重新填充它。我要试试这个,看看它的样子,但这似乎是一种笨拙的做法。
  2. 使用其他类型的布局,例如 FlowLayout。我对此进行了尝试,但它将所有n x m按钮排成一行。我不想使用水平滚动条,按钮从右边缘跑了。无论如何,它应该是一个二维的按钮网格。

解决此布局问题的最佳方法是什么?

4

4 回答 4

5

使用 GridLayout 创建一个按钮面板,并为其设置固定大小(当然可以在运行时计算)。按钮面板应该包含在 BoxLayout 的面板中。

查看BoxLayout 教程

非常非常基本的例子:

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);
    }
于 2011-04-20T14:39:43.083 回答
2

我在单列按钮上遇到了类似的问题,发现MiGLayout(第三方,在此处可用)对此非常简单有效。它有助于制作网格和设置按钮大小,尽管我花了一两天时间来适应它的语法。

但关键是设置按钮大小;GridLayout当然,这似乎是一种布局的方式,即网格。我还没有测试过,但我怀疑内置setXSize()方法也可以。本GridBagLayout教程提供了一些您可以对尺寸/定位进行的操作的示例。

于 2011-04-20T14:42:14.193 回答
2

FlowLayout 将是要走的路,但您可能会遇到一些配置问题。父组件使用什么布局管理器?

于 2011-04-20T14:43:22.233 回答
2

如果对话框变宽,但高度保持不变,则行数应该减少,而列数会增加。

Wrap Layout可能是您正在寻找的。

于 2011-04-20T16:47:42.697 回答