【问题标题】:Setlayout deleting my JPanel inherited class. Why?Setlayout 删除我的 JPanel 继承的类。为什么?
【发布时间】:2019-06-06 18:26:29
【问题描述】:

我将JLabel 和我自己的Panels 类添加到JFrame。顺便说一句,我创建的 Panels 类继承自 JPanel

我的代码只显示了两个组件之一,JLabelJPanel 继承类。当我添加 setLayout() 行时,JLabel 会显示,而当我不添加 JPanel 继承类时会显示。这是怎么回事?

public class TetisFrame extends JFrame{

    private final static int FRAME_WIDTH = 400;
    private final static int FRAME_HEIGHT = 720;

    private static Panels panels;

    public TetisFrame(){
        setTitle("Tetis");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(FRAME_WIDTH + 200, FRAME_HEIGHT + 50);
        setResizable(false);
        setLocationRelativeTo(null);

        JLabel points = new JLabel("Score: ");
        points.setBounds(450, 360, 100, 30);
        add(points);

        panels=new Panels();
        add(panels);
        addKeyListener(panels);

        setLayout(null);

        setVisible(true);
    }

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

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。 2) Java GUI 必须在不同的语言环境中使用不同的 PLAF 在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。
  • “这是怎么回事?” 默认情况下,JFrame 具有 BorderLayout。边框布局在每个布局约束中只能容纳一个组件。

标签: java swing jframe jpanel jlabel


【解决方案1】:

我的代码只显示了两个组件之一,JLabel 或 JPanel 继承类。

因为JFrame 默认具有BorderLayout 布局。如果你没有在BorderLayout指定位置,它会在CENTER位置添加元素。

所以:

  1. 我强烈建议不要extend JFrame,最好在你的类中创建它的实例,因为无论如何你都不会修改它的行为。

  2. 将您的组件添加为

    frame.add(points, BorderLayout.NORTH); //Or choose the location from the link above
    frame.add(panels, BorderLayout.CENTER);
    
  3. 不要使用setLayout(null);,因为它会删除Layout Manager,并且会在不同的操作系统/平台上产生一些奇怪/有趣/奇怪/疯狂/烦人的结果like this one。也不要手动设置组件的边界,让布局管理器为您完成:points.setBounds(450, 360, 100, 30); 不要使用它。 Null layout is evilfrowned upon

  4. 也不要忘记将您的程序放在 EDT 上,请参阅this answer 上的第 2 点

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2010-10-20
    • 2016-07-30
    • 2018-11-21
    相关资源
    最近更新 更多