【问题标题】:Trouble With GridBagLayoutGridBagLayout 的问题
【发布时间】:2014-02-23 16:05:21
【问题描述】:

我在使用 GridBagLayout 时遇到问题。

用户选择了一个文件,如果该文件大于我在其中显示的JTextArea,则共享GridBagLayout 中的所有Swing 组件都会出现问题。如果它能够适应JTextField,则所有 Swing 组件都可以。

这是我想要的JFrame 布局的screenshot

当包含文件路径的JTextArea 大于其分配的大小时,here 是我得到的JFrame 布局。

所有其他JTextFields 以及下面的按钮都会受到影响。我不在乎JTextArea 中的文本是否大于其大小,我只希望所有摆动组件保持不变。

这是我将 Swing 组件添加到文件信息面板的代码:

    //Setup layout.
    gbc = new GridBagConstraints();
    //File info panel.
    gbc.insets = new Insets(3, 10, 3, 10);
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    info_panel.add(first_name_jta, gbc);
    gbc.gridx = 1;
    gbc.gridy = 0;
    info_panel.add(first_name_tf, gbc);
    gbc.gridx = 0;
    gbc.gridy = 1;
    info_panel.add(last_name_jta, gbc);
    gbc.gridx = 1;
    gbc.gridy = 1;
    info_panel.add(last_name_tf, gbc);
    gbc.gridx = 0;
    gbc.gridy = 2;
    info_panel.add(frame_type_jta, gbc);
    gbc.gridx = 1;
    gbc.gridy = 2;
    info_panel.add(frame_type_cb, gbc);
    gbc.gridx = 0;
    gbc.gridy = 3;
    info_panel.add(eye_size_jta, gbc);
    gbc.gridx = 1;
    gbc.gridy = 3;
    info_panel.add(eye_size_tf, gbc);

    //Frame panel.
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridwidth = 2;
    gbc.fill = GridBagConstraints.BOTH;
    frame_panel.add(file_path_tf, gbc);
    gbc.gridy = 1;
    frame_panel.add(info_panel, gbc);
    gbc.gridy = 2;
    gbc.insets = new Insets(10, 60, 10, 60);
    gbc.fill = GridBagConstraints.NONE;
    gbc.anchor = GridBagConstraints.WEST;
    frame_panel.add(save_button, gbc);
    gbc.gridx = 1;
    gbc.gridy = 2;
    gbc.anchor = GridBagConstraints.EAST;
    frame_panel.add(cancel_button, gbc);

有什么想法吗?

【问题讨论】:

    标签: java swing gridbaglayout


    【解决方案1】:

    好的,这需要一些努力。

    基本上,当您构建frame_panel 时,您将gridwidth = 2 用于file_path_tfinfo_panel,这一切都很好,但您在添加按钮时永远不会重置属性。

    这意味着save_button可以占据第0列和第1列,cancel_button可以占据第1列和第2列

    在添加 info_pane 之后和添加按钮之前重置 gridwidth 属性

    gbc.gridwidth = 1;
    

    另外,我认为你会发现 JLabels 比 JTextAreas 更容易处理标签字段,但这只是我。

    【讨论】:

    • 文件路径是JTextField。当 JTextField 具有更大的值时,一切都会缩小。当它具有较小的值时,每个组件都设置为其默认大小。
    • 你能提供一个可运行的例子吗,你的代码让我失望了;)
    • 我尽我所能将您的代码示例重构为可运行的示例并更新了答案
    • 太棒了。我爱你。我也会将它们切换到 JLabels。有什么方法可以不让GridBagLayout 的列尺寸由文件路径所在的输入文本的大小决定?
    • 技术上并非如此。 JTextField,尤其是在这种情况下,将尝试扩展以填充可用空间。您可以尝试将按钮添加到自己的面板中,对所有三个组件(文件字段、信息面板和按钮面板)使用一列。这至少会阻止按钮对字段更改做出反应...
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多