Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据布局获取容器组件?_Java_Swing_User Interface_Layout_Jframe - Fatal编程技术网

Java 如何根据布局获取容器组件?

Java 如何根据布局获取容器组件?,java,swing,user-interface,layout,jframe,Java,Swing,User Interface,Layout,Jframe,在使用GUI的过程中,我遇到了两个不同的问题。 第一个问题是:如何获取容器组件?我想从BorderLayout中获得5个组件,并希望获得它们在布局中的位置知识,例如:塞纳、北、南、东、西 第二个问题是:我想计算gui布局,同时调整容器的大小,而不仅仅是当它在调整大小时。我怎么做 对于第一个问题,我尝试使用getComponenets方法,但它返回许多组件,而没有任何关于布局中组件位置的信息。 对于第二个问题,当我实现componentResized方法时,仅当resize进程结束时才会触发该事件

在使用GUI的过程中,我遇到了两个不同的问题。 第一个问题是:如何获取容器组件?我想从BorderLayout中获得5个组件,并希望获得它们在布局中的位置知识,例如:塞纳、北、南、东、西 第二个问题是:我想计算gui布局,同时调整容器的大小,而不仅仅是当它在调整大小时。我怎么做

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

    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);
    }
}
我想从BorderLayout中获得5个组件,并希望获得它们在布局中的位置知识,例如:塞纳、北、南、东、西

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

您可以使用:

BorderLayout layout = (BorderLayout)panel.getLayout();
访问布局管理器

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

我正在尝试用gui来构建应用程序,演示计算机键盘。由于每一行中有不同数量的键,其中一些键的大小也不同,所以我决定对键盘中的每一行使用FlowLayout

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

请看:例如

您只需添加:

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循环中提取单元格大小

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

现在,如果在gridx=1处添加一个按钮,gridwidth=2,那么按钮的宽度就是第1列和第2列的宽度,在本例中就是每列中虚拟按钮的宽度

但是,经过编辑的解决方案甚至更好,因为您不需要虚拟按钮来确定22列中每个列的宽度

数组的大小定义列数

分配给数组中每个项的值是列的最小宽度,每个列的宽度可以不同


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

您可以发布代码吗?当我实现ComponentResistized方法时,事件仅在resize进程结束时触发,-我得到多个事件。张贴你的演示问题。我从代码中添加了一个片段。。。我希望对于JFrame中的每一个更改,我都会使用FlowLayout计算JPanel中的JButtons。我正在尝试用gui来构建应用程序,演示计算机键盘。由于每一行中有不同数量的键,其中一些键的大小也不同,所以我决定在键盘的每一行中使用FlowLayout。我希望按键会根据JFrame大小的变化而放大/缩小。这不是一种在尺寸变化期间,而不仅仅是在变化结束时,倾听JFrame尺寸变化的方法吗?这不是MRE。代码不进行事件编译,那么y如何
你能测试一下吗?对于在Windows7上使用JDK8的我来说,我不断地将组件还原。。。方法在我调整帧大小时调用。@camick,它仅在调整大小完成时有效,但在调整大小期间不会发生任何事情!我想在站在JFrame边缘时,按下鼠标左键而不释放和移动鼠标,我将能够对每次移动进行计算,而不仅仅是在释放鼠标时!我阅读了您发送链接的示例。看来它能帮助我。但我对这个例子有一些疑问:1.如何允许动态垂直调整大小,以保持按钮比例gbc.weighty=1.0f?2.我阅读了JavaAPI,但我不明白哪一个比例变量gridx和gridy被计算为3。我试图从api中理解gridwidth和gridheight属性的含义,但我根本不理解解释,可能是因为我不理解组件显示区域的含义。我很乐意理解它的含义?我很难理解代码,我不想再麻烦了,所以谢谢你,我会批准你的回答。阅读上的Swing教程,了解有关约束和工作示例的更多信息。别忘了点击复选标记接受答案,因为你原来的问题已经回答了。你能解释一下为什么示例中的gridy从1开始而不是从0开始吗?除了for循环,它不会覆盖第四行按钮?我复制了代码并运行了这个示例,我得到了第一行的小按钮,它们应该在那里吗?此外,JPanel边框根本不存在,并且与打印屏幕中显示的不一样。。你能猜出原因吗?好的,我明白。但是在链接中的所有讨论中,我没有找到一个参考资料来解释为什么在您发布的第一个代码中,您得到的键盘与您要求的大小不符。e、 g:在第一排,所有的键盘尺寸都一样,只有最后一排之前的按钮比其他的大?这是逻辑解释还是布局管理器无法预测?您建议的for循环或可选代码是什么,使键盘具有正确的大小?