垂直对齐的组件在运行时一起移动

vertically aligned components move together at runtime

我有两个组件(textfieldjList)。当它们垂直对齐时,它们会在运行时一起移动。

如图所示,文本字段左侧有一个 lblIcon,下面的代码在 initcomponents 方法中有效。

lblIcon.setIcon(new ImageIcon(new ImageIcon("icons/yeniNotBtn.png").getImage().getScaledInstance(25, 25, Image.SCALE_DEFAULT)));

当它工作时 textfield 向右浮动一点并且 jList 也向右移动。 我认为布局有些问题,但我想不通。最好能听到有关布局的一般性建议。我是新手。提前致谢。

使用swing的任何组件时,请设置布局。

如果您也这样做了,frame.setLayout(null) 那么请使用 setBounds(x,y,width,height) 方法绑定您的组件。

它将绑定您的组件,就像您放入容器中一样。

生成布局有点像魔法和巫术,这通常需要对可用的布局管理器有一定的了解。

一个布局管理器无法解决您的所有问题(所有时间),您倾向于使用一系列布局管理器,每个布局管理器专注于 UI 的特定部分来解决一个问题具体问题。

例如,您的布局可以通过将 JLabelJTextField 放在使用 FlowLayoutJPanel 中来解决,然后将其与JList 到另一个使用 BorderLayout.

JPanel

您采取的方法将取决于更大的图景,并且需要比您的问题中可用的更多信息。

我能给出的最重要的建议是:

  • 尝试一些不同的东西,使用不同的布局
  • 将 UI 分解为逻辑工作单元并为这些部分设计布局,根据需要将它们放置在自己的容器中。对我来说,这也突出了工作单元并帮助我生成我的 class 层次结构,而不是最终得到一个单一的 class 负责管理十几个或更多组件的状态
  • 避免依赖表单编辑器,它们不会教您真正构建复杂 UI 所需的技术和想法。不要误会我的意思,我在日常工作中使用它们,但我花了 10 年以上的时间手工编写 UI 的代码,所以我不怕做半打左右 "forms" 生成单个 "unified" 界面。 GroupLayout 也是一个彻头彻尾的痛苦,我看到它崩溃的次数比我想回想的要多,我倾向于避免它,而倾向于其他解决方案。
  • 使用表单编辑器试验不同的布局管理器或布局管理器及其属性的组合,当您尝试解决特定问题时,它们会提供快速、直观的反馈,但直到您熟悉编写代码手动布局,我会避免依赖它们

下面的示例使用了 GridBagLayout,它是一种更灵活但也是更复杂的布局管理器之一,但它允许您做一些非常了不起的事情。

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestLayout {

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

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

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                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(8, 8, 2, 8);
            add(new JLabel(new ImageIcon(getClass().getResource("/gender_neutral_user.png"))), gbc);
            gbc.gridx++;
            gbc.insets = new Insets(8, 2, 4, 8);
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(new JTextField(10), gbc);

            JList list = new JList();
            list.setVisibleRowCount(10);
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.gridx = 0;
            gbc.gridy++;
            gbc.insets = new Insets(4, 8, 8, 8);
            gbc.fill = GridBagConstraints.BOTH;
            add(new JScrollPane(list), gbc);
        }

    }

}

查看 Laying Out Components Within a Container, How to Use GridBagLayout, How to Use BorderLayout and How to Use FlowLayout 了解更多详情