【问题标题】:Positioning a JLabel on the top left corner of JFrame将 JLabel 定位在 JFrame 的左上角
【发布时间】:2014-11-28 06:16:27
【问题描述】:
public class a5Frame2 extends JFrame implements KeyListener
{
    public a5Frame2()
    {
        super("TV");
        setLocation(450, 75);
        setFocusable( true );
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel(new BorderLayout());
        JPanel panel = new JPanel();
        this.setLayout(new BorderLayout());

        panel.setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        JLabel channelNumber = new JLabel("hello");
        gc.gridx = 0;
        gc.gridy = 0;
        gc.anchor = GridBagConstraints.NORTHWEST;
        gc.insets = new Insets(2, 0, 0, 2);
        panel.add(channelNumber, gc);

        mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
        mainPanel.add(panel, BorderLayout.NORTH);
        this.add(mainPanel);
        this.setVisible(true);

        this.addKeyListener(this); 
    }
}

JLabel hello 当前位于 JFrame 的顶部北部。我希望它位于 JFrame 的左上角。我很确定gc.anchor = GridBagConstraints.NORTHWEST; 可以完成这项工作,但在这种情况下它不起作用。有谁知道为什么它不起作用?

Here is an image of my current JFrame

【问题讨论】:

  • gc.weightx = 1 添加到您的约束中
  • this.addKeyListener(this); 对于 Swing,我们通常使用 key bindings 而不是较低级别的 KeyListener

标签: java swing jlabel layout-manager gridbaglayout


【解决方案1】:

gc.weightx = 1 添加到您的约束中

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class a5Frame2 extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new a5Frame2();
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public a5Frame2() {
        super("TV");
        setLocation(450, 75);
        setFocusable(true);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel(new BorderLayout()){

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }

        };
        JPanel panel = new JPanel();
        this.setLayout(new BorderLayout());

        panel.setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        JLabel channelNumber = new JLabel("hello");
        gc.gridx = 0;
        gc.gridy = 0;
        gc.weightx = 1;
        gc.anchor = GridBagConstraints.NORTHWEST;
        gc.insets = new Insets(2, 0, 0, 2);
        panel.add(channelNumber, gc);

        mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
        mainPanel.add(panel, BorderLayout.NORTH);
        this.add(mainPanel);
        this.setVisible(true);

    }
}

正如在 cmets 中已经指出的那样,KeyListeners 不是一个好主意,尤其是当直接连接到 JFrame 时,有太多东西会妨碍并阻止 KeyListener 触发事件。

查看How to Use Key Bindings 以获得更好的选择

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多