在Swing的GUI组件定位(Positioning components in Swing GUI

2019-07-17 14:51发布

我对定位部件的一些问题,并在文本字段和文本区域(的Java Swing)的一些问题。 任何帮助是极大的赞赏。

现在我想拥有对方旁边的两个文本字段与上述各描述了文本字段做什么不同的标签。 为了实现这一点,我已经把他们在一个GridLayout(2, 2)

  1. 这是最好的办法吗? 这是我知道的有一个标签直接在另一个组件的唯一途径。 有没有更好的办法? 那么如果只有一个标签上面的一个按钮。 难道明智通过定位这个GridLayout(2, 1) 我有视觉障碍,所以我不认为仅仅通过其像素位置的定位按钮是一个选项,除非有一个简单的方法来放置元件在像素的另一个部件的相对数。

  2. 这使我对我的下一个问题。 什么是具有相同的用户界面如上所述,但与下它为中心的另一部件(按钮)的最佳方式。 本质上,UI应与下计算按钮组成两个命名文本字段。 我这样做的方法是通过将在面板上述组分,并加入该加计算按钮为与周围的面板GridLayout(2, 1) 问题是,该按钮会变为大,因为它上面的面板(我假设)。 如何调整这一点,仍然有按钮文本字段/标签的面板下完全一致? 同样与上述文本区域的标签。 标签应该是体积小,但对下面的文本区域更大的空间。

  3. (文本字段):再参照上面的用户界面,如果用户键入的字符到第一个文本字段,将字母去了文本字段右边? 如果是的话我该如何避免这种情况?

  4. 如果我追加文本到文本区域,它是已经满了,会自动将其允许用户滚动? 如果不是一个简单的方法,使文本区滚动?

  5. 现在我没有设定一个尺寸文本区域。 难道它只是成长为我添加文本? 它有一个默认的大小以字符数?

Answer 1:

有一些布局管理器,可能是能为你提供你所需要的的。

  • MigLayout
  • JGoodies数据的FormLayout
  • GridBagLayout的

因为, 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的建议,同意让您的生活更轻松,从长远来看

您可能会发现布放组件内的容器一个值得读。



Answer 2:

现在我想拥有对方旁边的两个文本字段与上述各描述该文本框做什么不同的标签。 为了实现这一点,我已经将它们放置在GridLayout(2,2)。 这是最好的办法吗? 这是我知道的有一个标签直接在另一个组件的唯一途径。 有没有更好的办法? 那么如果只有一个标签上面的一个按钮。 难道明智通过网格布局来定位这个(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_STARTBorderLayout.LINE_END而不是使用BorderLayout.WESTBorderLayout.EAST ,这将增加对RTL语言(如阿拉伯语)的支持。


这使我对我的下一个问题。 什么是具有相同的用户界面如上所述,但与下它为中心的另一部件(按钮)的最佳方式。 本质上,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);

第三(文本字段):再参照上面的用户界面,如果用户键入的字符到第一个文本字段,将字母去了文本字段右边? 如果是的话我该如何避免这种情况?

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


第四:如果我追加文本到文本区域,它是已经满了,会自动将其允许用户滚动? 如果不是一个简单的方法,使文本区滚动?

您需要使用一种叫做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);

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



文章来源: Positioning components in Swing GUIs