java - 在 Swing GUI 中定位组件

标签 java swing jtextfield layout-manager jtextarea

我有一些关于定位组件的问题,还有一些关于文本字段和文本区域(Java Swing)的问题。非常感谢任何帮助。

现在我正在尝试让两个文本字段并排放置,每个文本字段上方都有一个不同的标签来描述该文本字段的作用。为此,我将它们放置在 GridLayout(2, 2) 中。

  1. 这是最好的方法吗?这是我知道直接在另一个组件上贴标签的唯一方法。有没有更好的办法?如果一个按钮上面只有一个标签呢?通过 GridLayout(2, 1) 定位它是否明智?我有视力障碍,所以我不认为仅通过像素位置定位按钮是一种选择,除非有一种简单的方法可以将组件放置在相对于另一个组件的像素数处。

  2. 这引出了我的下一个问题。 拥有与上面相同的用户界面但在其下方居中的另一个组件(按钮)的最佳方式是什么。本质上,UI 应该由两个命名文本字段组成,下面有一个计算按钮。我这样做的方法是将上述组件放在面板中,然后将其加上计算按钮添加到带有 GridLayout(2, 1) 的周围面板。问题是按钮变得和它上面的面板一样大(我假设)。我怎样才能调整它并且仍然使按钮在文本字段/标签面板下完美对齐?与文本区域上方的标签类似。标签应较小,但下方的文本区域应有较大空间。

  3. (文本字段): 再次引用上面的 UI,如果用户在第一个文本字段中键入许多字符,这些字母是否会覆盖右侧的文本字段?如果是这样,我该如何预防?

  4. 如果我将文本附加到文本区域并且它已经满了,它会自动允许用户滚动吗?如果不是,使文本区域可滚动的简单方法是什么?

  5. 现在我没有设置文本区域的大小。它会随着我添加文本而增长吗?它是否有默认大小(如字符数)?

最佳答案

有许多布局管理器可能能够满足您的需求。

因为,GridBagLayout 将是我的选择(我有偏见,因为在过去的 12 年里我一直在使用这个布局管理器;))

enter image description here

public class TestLayout17 {

    public static void main(String[] args) {
        new TestLayout17();
    }

    public TestLayout17() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);

            add(new JLabel("Label 1"), gbc);
            gbc.gridx++;
            add(new JLabel("Label 2"), gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(new JTextField(10), gbc);
            gbc.gridx++;
            add(new JTextField(10), gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.fill = GridBagConstraints.NONE;
            gbc.gridwidth = 2;
            add(new JButton("Click"), gbc);

        }

    }

}

我也同意 Eng.Fouad 的建议,从长远来看,使用复合容器可以让您的生活更轻松

您可能会找到 Laying Out Components Within a Container值得一读。

关于java - 在 Swing GUI 中定位组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14046837/

相关文章:

java - 如何在 JTable 上添加复选框?

java - 自定义渲染器中单元格内容的 JTable 对齐

Java - JTextField - 当用户按下 "space bar"时调用函数

java - 无法将 JTextField 设置为 int

java - 从单独的类中打印 toString()

java - DOCX4J:如何向 docx 模板中的现有表添加行?

Java:使用未知键解析 JSON 以映射

java - JTextArea 文本可以看起来像控制台吗?

添加 JTextfield 后 Java 不呈现组件

java - 如何将值从 jtextfield 复制到 jspinner