有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JLabel在JPanel上的java定位

我正在手工编写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 screenshot


共 (2) 个答案

  1. # 1 楼答案

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

    GridBagLayout

    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);
            }
    
        }
    
    }
    

    详见Laying Out Components Within a ContainerHow to Use GridBagLayout

    记住,单个布局管理器不太可能解决所有问题,有时需要使用两个或更多个布局管理器才能实现整体效果

  2. # 2 楼答案

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

    话虽如此,代码不能正常工作的原因是容器默认有一个布局。您可以按如下方式删除布局

    mainPanel.setLayout(null);
    

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