gpt4 book ai didi

java - Setlayout 删除我的 JPanel 继承类。为什么?

转载 作者:行者123 更新时间:2023-11-30 01:49:43 27 4
gpt4 key购买 nike

我将 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();
}
}

最佳答案

My code only shows one of the two components, the JLabel or the JPanel inherited class.

因为 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 点。

关于java - Setlayout 删除我的 JPanel 继承类。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483174/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com