5

我有一些关于定位组件的问题以及一些关于文本字段和文本区域(Java Swing)的问题。任何帮助是极大的赞赏。

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

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

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

  3. (文本字段):再次参考上面的 UI,如果用户在第一个文本字段中输入了许多字符,这些字母会超过右侧的文本字段吗?如果是这样,我该如何防止这种情况?

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

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

4

2 回答 2

10

现在,我正在尝试将两个文本字段并排放置,每个文本字段上方都有一个不同的标签来描述该文本字段的作用。为此,我将它们放置在 GridLayout(2, 2) 中。这是最好的方法吗?这是我所知道的将标签直接放在另一个组件上的唯一方法。有没有更好的办法?如果一个按钮上方只有一个标签怎么办。通过 GridLayout(2, 1) 定位它是否明智?

我自己,我总是通过嵌套面板使用BorderLayout. 例如:

在此处输入图像描述

JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

panOuter.add(panLeft, BorderLayout.WEST);
panOuter.add(panRight, BorderLayout.EAST);

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);

JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);

panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);

panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);

frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);

请注意,您可以通过设置空边框来操纵组件之间的间隙。此外,您可以使用BorderLayout.LINE_STARTandBorderLayout.LINE_END而不是使用BorderLayout.WESTand BorderLayout.EAST,这将增加对 RTL 语言(例如阿拉伯语)的支持。


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

我会像之前那样通过嵌套面板来完成,但现在底部面板有一个FlowLayout布局管理器,可以为按钮获得合适的尺寸:

在此处输入图像描述

JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

panOuter.add(panLeft, BorderLayout.WEST);
panOuter.add(panRight, BorderLayout.EAST);
panOuter.add(panBottom, BorderLayout.SOUTH);

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);

JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);

JButton btnBottom = new JButton("Press it!");

panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);

panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);

panBottom.add(btnBottom);

frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);

与文本区域上方的标签类似。标签应该很小,但为下面的文本区域留出更大的空间。

我建议你使用TitledBorder

在此处输入图像描述

JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

JPanel panInput = new JPanel(new BorderLayout());
panInput.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panConsole = new JPanel(new BorderLayout());

Border outsideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
Border insideBorder = BorderFactory.createTitledBorder("The Console");
Border theBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
panConsole.setBorder(theBorder);

panInput.add(panLeft, BorderLayout.WEST);
panInput.add(panRight, BorderLayout.EAST);
panInput.add(panBottom, BorderLayout.SOUTH);

panOuter.add(panInput, BorderLayout.NORTH);
panOuter.add(panConsole, BorderLayout.CENTER);

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);

JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);

JButton btnBottom = new JButton("Press it!");

JTextArea txtConsole = new JTextArea(5, 10);

panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);

panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);

panBottom.add(btnBottom);

panConsole.add(txtConsole, BorderLayout.CENTER);

frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);

第三个(文本字段):再次参考上面的 UI,如果用户在第一个文本字段中输入了很多字符,这些字母会不会越过右边的文本字段?如果是这样,我该如何防止这种情况?

试试上面的代码,看看它是如何工作的:)


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

你需要使用一种叫做JScrollPane

在此处输入图像描述

JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

JPanel panInput = new JPanel(new BorderLayout());
panInput.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panConsole = new JPanel(new BorderLayout());

Border outsideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
Border insideBorder = BorderFactory.createTitledBorder("The Console");
Border theBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
panConsole.setBorder(theBorder);

panInput.add(panLeft, BorderLayout.WEST);
panInput.add(panRight, BorderLayout.EAST);
panInput.add(panBottom, BorderLayout.SOUTH);

panOuter.add(panInput, BorderLayout.NORTH);
panOuter.add(panConsole, BorderLayout.CENTER);

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);

JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);

JButton btnBottom = new JButton("Press it!");

JTextArea txtConsole = new JTextArea(5, 10);

JScrollPane srcPane = new JScrollPane(txtConsole,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);

panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);

panBottom.add(btnBottom);

panConsole.add(srcPane, BorderLayout.CENTER);

frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);

我希望我回答了你所有的问题:)

于 2012-12-26T22:29:24.340 回答
10

有许多布局管理器可能能够为您提供所需的内容。

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

在此处输入图像描述

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 的建议,即从长远来看,使用复合容器让您的生活更轻松

您可能会发现在容器中布局组件值得一读。

于 2012-12-26T22:53:10.843 回答