【问题标题】:GridLayout not honoring the number of rows I want per columnGridLayout 不尊重我想要的每列的行数
【发布时间】:2013-01-30 16:27:24
【问题描述】:

我有以下,

GridLayout layout = new GridLayout(4, 0);

如果我有5 项目,这将创建2 列,其中第一个包含3 行,第二个包含2 行。这不是我想要的,也不是我所期望的。我希望第一列包含4 行,第二列包含1 行。

为什么这个布局管理器不考虑我想要的每列的行数?或者更好的是,我如何让这个布局管理器尊重这一点?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 请发布一个 SSCCE(由@AndrewThompson 链接),因为这有助于我们不必自己编写代码来重新解决您的问题。
  • @DavidKroukamp,我很抱歉,但我通常很乐意加入 SSCCE..

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


【解决方案1】:

结果似乎是预期的:“指定列数仅在行数设置为零时影响布局。”

使用JList可以得到想要的效果,如图here

private static final int N = 5;
...
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(N - 1);

【讨论】:

  • 我喜欢这种方法,但很遗憾你不能用这个布局管理器配置方向...:(
  • 是的; ListUI 使用 CellRendererPane 进行享元渲染,而不是布局管理器。另请参阅此 Q&A 建议 MigLayout。
  • 这实际上对我来说不是很好,因为组件是JRadioButtons,这将迫使我实现自定义渲染器等等。我想我要嵌套面板FlowLayoutBoxLayout...我会回来报告的。
  • 啊,你需要一个编辑器,JList 不支持。您可能可以使用JToggleButton,用于exampleexample
【解决方案2】:

免责声明:这不是作为具体答案提供的,而是为了证明SSCCE...的有用性。

GridLayout 构造函数是GridLayout(int rows,int cols)(我提到它的原因就像@AndrewThompson 在他的回答中所说的那样,您可能已经混淆了LayoutManager 的行/列的参数)。因此4,0 将为我们提供 4 行和可变数量的列。

当我添加 4 个标签时,我得到 4 行和 1 个列(如预期的那样):

当您添加 5 个标签时,我得到 3 行和 2 个列,每个有 2 个项目,除了最后一个有 1 个:

IMO 这是预期的GridLayout 必须遵守列/行计数 >0(任何小于 0 并且 LayoutManager 计算数量),因此如果我们添加的组件多于允许的行数,它会创建一个新的列 >0 但也>1 因为 0 和 1 执行相同的操作。因此,当我们用 5 个组件填充 4x0 的 Grid 时,它现在创建 2 个列,我们期望每行(每个列)有 2 个组件,最后一行(不一定是最后一行,具体取决于组件的数量,即8 会将其填充到最后一行,因为现在它的 4x2 但添加 9 个组件会导致 GridLayout 为 4x3 - 在进入新行之前填充该行的所有列)

请发布SSCCE 重新解决问题,否则我们只是猜测这是我所做的示例,它显示的行为与您所说/得到的不同:

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        GridLayout layout = new GridLayout(4, 0);
        frame.setLayout(layout);

        for (int i = 0; i < 5; i++) {
            frame.add(new JLabel(String.valueOf(i + 1)));
        }

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Create Swing components on EDT
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }
}

【讨论】:

  • +1,不错的 SSCCE,再一次(我们不得不说多少次)证明了它的用处 ;-)
【解决方案3】:

您指定的 GridLayout 的列数为 0。这意味着列数由布局决定。在这种情况下,它会尝试根据项目数计算所需的列数。

如果您添加了 4 个组件,您将得到 4 行,每行一个组件。如果添加 5 个组件,则需要两列,并且它们会依次填充组件,这意味着只会消耗 3 行。

因此,根据您的组件数量,您可能会看到是否使用了所有指定的行。例如尝试使用 7 个组件。

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多