Java 在JPanel上定位JLabel

Java 在JPanel上定位JLabel,java,swing,Java,Swing,我正在手工编写GUI,在JPanel上定位JLabel时遇到了困难。我试图将它放在JTextField上方的左上角,但它默认位于中间,即使我正在设置边界: 相关代码: JPanel mainPanel = new JPanel(); JLabel myFleetLabel = new JLabel("My Fleet"); myFleetLabel.setBounds(1,1, 10, 10); mainPanel.add(myFleetLabel); add(mainPanel); 下

我正在手工编写GUI,在JPanel上定位JLabel时遇到了困难。我试图将它放在JTextField上方的左上角,但它默认位于中间,即使我正在设置边界:

相关代码:

JPanel mainPanel = new JPanel();

JLabel myFleetLabel = new JLabel("My Fleet");
myFleetLabel.setBounds(1,1, 10, 10);

mainPanel.add(myFleetLabel);

add(mainPanel);
下面是它的样子:

通常需要使用将对象放置在容器中。您应该熟悉布局,以便在swing中真正正确地编写代码

也就是说,代码不能按原样工作的原因是,默认情况下容器有一个布局。您可以按如下方式删除布局

mainPanel.setLayout(null);

但是这是一种非常糟糕的做法,应该始终避免。

有几种方法可以实现这一点,例如,可以使用
GridBagLayout
作为主布局管理器

有关更多详细信息,请参阅和


请记住,单个布局管理器不太可能解决所有问题,有时您需要使用两个或两个以上的布局来实现总体效果

避免使用
null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局经理一起工作,放弃这些将导致问题层出不穷,您将花费越来越多的时间来纠正这些问题。请看一看,也许可以解释一下?我提供了使用布局的文档(正确的方法),但也解释了为什么他的代码不起作用以及如何使其按原样工作。不是downvoter,而是一个支持者:避免使用
null
布局,像素完美的布局在现代ui设计中是一种幻觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与核心的布局管理器一起工作,丢弃这些将导致无止境的问题,您将花费越来越多的时间试图纠正这些问题,更新以强调不使用空布局的重要性,但我感觉好像展示了“修复”的一行代码他的代码在理解swing的过程中很有帮助。@Cruncher“但我觉得展示一行代码“修复”他的代码在理解swing的过程中很有帮助”-但是
null
布局没有修复任何东西,事实上它们增加了问题。花点时间演示一个简化的解决方案,该解决方案演示了OP需要学习的概念,以便更好地解决此问题以及将来的其他问题,并备份教程或其他更详细的示例。说“这是不推荐的,但你可以这样做”对OP或任何其他可能有类似问题的人都没有帮助。@Cruncher在一天结束时,你有权发表你的意见,就像我们一样,但当整个社区都不宽恕你的做法时,你不应该感到不安。仅仅因为有些东西“有效”并不意味着它是正确的。如果你在教一些人射击,你会教他们如何扣动扳机吗?它是有效的,或者你会教他们枪支安全和瞄准的基本原则吗?当然,你的回答会“起作用”,但你刚刚离开了OP,用枪射自己的脚,用枪射社区的其他人来收拾残局,所以当我们感到不安时,请原谅我们;)@约翰很高兴这能帮上忙
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        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.anchor = GridBagConstraints.NORTHWEST;
            JLabel label = new JLabel("My Fleet: ");
            add(label, gbc);

            JTextArea ta = new JTextArea(10, 20);
            gbc.gridx++;
            add(new JScrollPane(ta), gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.gridwidth = 2;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(new JScrollPane(new JTextArea(5, 10)), gbc);

            JPanel actions = new JPanel();
            actions.add(new JButton("Create Ship"));
            actions.add(new JButton("Flip Coins"));

            gbc.gridy++;
            add(actions, gbc);
        }

    }

}