【问题标题】:How to get container components according to layout?如何根据布局获取容器组件?
【发布时间】:2019-08-02 21:24:08
【问题描述】:

我在使用 GUI 时遇到了两个不同的问题。 第一个是:如何获取容器组件?我想从 BorderLayout 获得 5 个组件(并且更喜欢让它们了解布局中的位置,例如:CENER、NORTH、SOUTH、EAST、WEST 第二个是:我想“计算” gui 布局,同时调整容器的大小,而不仅仅是现在它已经弯腰调整大小。我该怎么做?

对于第一个问题,我尝试使用 getComponenets() 方法,但它返回许多组件,而没有关于组件在布局中的位置的任何信息。 对于第二个问题,当我实现方法 componentResized() 时,仅在调整大小过程结束时才会触发事件,但我想为容器中的每个更改计算布局

    public class GridLayoutFrame extends JFrame  
{
    LabelAndJtextAreaPanel topPanel;
    //KeyboardbuttonPanel buttomPanel ;

    public GridLayoutFrame ()
    {
        super("Typing Application");
        setLayout(new GridLayout());
        topPanel = new LabelAndJtextAreaPanel();
        add(topPanel);

        addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                System.out.println("componentResized\n");
                // want to put here many calculation during JFrame is resized
            }
        }
        );
        */
        setSize(300,200);
        setVisible(true);

    }

    public static void main(String[] args)
    {
        GridLayoutFrame frame = new GridLayoutFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

【问题讨论】:

  • 你能发布你的代码吗?
  • 当我实现方法 componentResized() 时,只有在调整大小过程结束时才会触发事件, - 我收到多个事件。发布您的minimal reproducible example 来证明问题。
  • 我从代码中添加了一个片段...我正在尝试使用演示计算机键盘的 gui 构建应用程序。并且因为在每一行中都有不同数量的键,并且其中一些键的大小不同,所以我决定对键盘中的每个“行”使用 FlowLayout。我希望按键会根据 JFrame 大小的变化而放大/缩小。是不是一种在大小更改期间而不是仅在更改结束时收听 JFrame 大小更改的方法?
  • 那不是 MRE。代码没有事件编译,所以你怎么测试它?对于在 Windows 7 上使用 JDK8 的我来说,我在调整框架大小时不断调用 componentResized(...) 方法。
  • @camick,它仅在调整大小完成后才有效,但在调整大小期间没有任何反应!我想要 JFrame 边缘的同时站立,按下鼠标左键(不释放)并移动鼠标,我将能够为每次移动进行计算,而不仅仅是在释放鼠标时!

标签: java swing user-interface layout jframe


【解决方案1】:

我想从 BorderLayout 获得 5 个组件(并且更喜欢在了解布局中的位置的情况下获得它们,例如:CENER、NORTH、SOUTH、EAST、WEST

好吧,只有 BorderLayout 知道您使用了哪些约束。这样就可以在BorderLayout API 中找到这些信息。查看各种 getter 方法。

你会使用:

BorderLayout layout = (BorderLayout)panel.getLayout();

访问布局管理器。

然后,您将使用 API 中的适当方法为每个约束请求组件。

我正在尝试使用 gui 构建应用程序来演示计算机键盘。并且由于在每一行中都有不同数量的键,并且其中一些键的大小不同,我决定为键盘中的每个“行”使用 FlowLayout

更好的解决方案是让布局管理器来调整大小。

Why does this GridBagLayout not appear as planned?为例。

您只需要添加:

gbc.weightx = 1.0f;

查看示例以允许动态水平调整大小。

编辑:

尝试回答与其他链接相关的问题。

查看其他链接中的图片。您将看到每行包含 5 到 8 个按钮,这意味着 GridBagLayout 只知道 8 个单独列的大小。

将 (..) 中的数字相加,表示每行的网格宽度。总数为 22 个。

GridBagLayout 不知道如何将 8 列变成 22 列。它不知道每列使用什么宽度。

因此建议的解决方案是在一行中添加 22 个虚拟组件。现在每列都有一个宽度,因此指定“gridwidth”现在对 GridBagLayout 意味着什么。

在您将看到的代码中,我尝试将虚拟按钮分配给 gridy=4,但代码错误:

ui.add(new JButton()); //wrong
//ui.add(new JButton(), gbc); // what I should have had

现在默认行为是您不指定 GridBagConstraint,仅在第一行显示每个组件(即 gridy=0)。

所以问题是现在你有两行按钮试图在 gridy=0 处显示,这显然是错误的。

当时我没有意识到我忘记为虚拟按钮指定“gbc”,所以我只是调整了每一行按钮的网格,这就是为什么你会看到如下代码:

//gbc.gridy = 0;
gbc.gridy = 1;

我只是将键盘按钮的每一行向下移动 1,因此虚拟按钮可以在 gridy=0 处显示。

如果你想看到底部的按钮,修改代码如下:

//gbc.gridy = 4;
//ui.add(new JButton());
gbc.gridy = 5;
ui.add(new JButton(), gbc);

现在,gridy=1、2、3、4、5 的组件将存在。gridy=0 中没有组件。

GridBagLayout 从“for”循环中“lerans”单元格大小

是的,因为每个按钮都有自己的大小。由于在一行中添加了 22 个按钮,因此 GridBagLayout 知道所有 22 列的最小宽度。

所以现在如果你在 gridx=1 处添加一个按钮,并且 gridwidth=2,按钮的宽度就是第 1 列和第 2 列的宽度,在这种情况下就是每个虚拟按钮的宽度列。

但是,“编辑”解决方案更好,因为您不需要虚拟按钮来确定 22 列中每一列的宽度。

数组的大小定义了列数。

分配给数组中每个条目的值是列的“最小宽度”(每列可以不同)。

所以现在,即使您没有虚拟组件,GridBagLayout 也知道如何计算每列的宽度,并且使用“gridwidth”将按预期工作。

【讨论】:

  • 我阅读了您发送链接的示例。看来它可以帮助我。但我对这个例子有一些疑问:1.我怎样才能允许动态垂直调整大小以保持按钮比例(gbc.weighty = 1.0f)? 2.我读了java api,但我不明白在哪个比例变量gridx和gridy中计算3.我试图从api中理解gridwidth和gridheight属性的含义,但我不明白解释在全部,可能是因为我不明白那里使用的“组件显示区域”的含义。我会很高兴理解其中的含义?
  • 我很难理解代码,我不想再打扰了,所以谢谢,我会批准你的回答
  • 阅读 How to Use GridBagLayout 上的 Swing 教程,了解有关约束和工作示例的更多信息。并且不要忘记通过单击复选标记“接受”答案,因为您的原始问题已得到回答。
  • 您能解释一下为什么示例中的 gridy 从 1 开始而不是从 0 开始吗​​?除了for循环,它不会覆盖第四行按钮吗?我复制代码并运行示例,我得到了第一个按钮行(小按钮),它们应该在那里吗?此外,JPanel 边框根本不存在,也不像打印屏幕中显示的那样......你能猜到为什么吗?
  • 好的,我明白了。但是在链接中的所有讨论中,我没有找到解释为什么在您发布的第一个代码中,您得到的键盘不适合您要求的尺寸。例如:在第一行中,所有键盘的大小都相同,只有最后一个之前的按钮比其他的大?是逻辑解释还是布局管理器不可预测的行为?您建议的“for”循环或替代代码是什么使键盘尺寸正确?
猜你喜欢
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2021-11-11
  • 2023-04-03
相关资源
最近更新 更多