【问题标题】:Best Swing Layout for 2-dimensional grid of buttons?二维按钮网格的最佳 Swing 布局?
【发布时间】:2011-04-20 14:33:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如何为持有按钮的 JPanel 使用 gridlayout,然后将此 JPanel 嵌套在另一个 JPanel 中,该 JPanel 使用 FlowLayout 或其他不调整持有按钮的 JPanel 大小的布局。
  • 这其实是MByD贴出来的代码。尽管它建议使用 BoxLayout,但该演示确实使用了具有默认布局的 JPanel,即 FlowLayout。

标签: java swing layout-manager grid-layout flowlayout


【解决方案1】:

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

查看BoxLayout Tutorial

非常非常基本示例:

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);
    }

【讨论】:

  • +1,最简单的。尽管您应该更改描述以使用 FlowLayout,因为那是您的演示代码正在做的事情。
  • 这里的按钮确实保持相同的大小。问题是封闭面板的大小保持不变。我想要的是包含要更改的按钮的网格的尺寸。例如,如果对话框变宽,但高度保持不变,则行数应该减少,而列数会增加。
  • @Paul - 我真的不清楚。你想有一个默认的“网格”视图,但是当改变大小以将其更改为不同的视图时?我认为解决方案必须包括硬编码值或一些计算,我不确定你是否喜欢。另一种选择是为每个按钮创建具有固定大小的面板,但我认为您也不喜欢这样。
  • 我实际上误解了这个问题。我确实想要一个 FlowLayout。我在这里重申了这个问题:stackoverflow.com/questions/5735577/…
【解决方案2】:

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

Wrap Layout 可能就是您要找的。​​p>

【讨论】:

    【解决方案3】:

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

    但关键是设置按钮大小; GridLayout 似乎是布局网格的最佳方式。我没有测试过,但我怀疑内置的setXSize() 方法也可以。 GridBagLayout tutorial 提供了一些关于尺寸/定位的示例。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2022-11-04
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-29
        • 1970-01-01
        • 2016-05-05
        相关资源
        最近更新 更多