我正在将JLabel
和我自己的Panels
类都添加到JFrame
中。顺便说一下,我制作的Panels
类是从JPanel
继承的。
我的代码仅显示了两个组件之一,即JLabel
或JPanel
继承的类。当我添加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();
}
}
答案 0 :(得分:2)
我的代码仅显示了JLabel或JPanel继承的两个组件之一。
因为JFrame
的布局默认为BorderLayout。而且,如果您未在BorderLayout
中指定位置,则会将元素添加到CENTER
位置。
所以:
我强烈建议不要extend JFrame并在您的类中更好地创建它的实例,因为您还是不会修改它的行为。
将您的组件添加为
frame.add(points, BorderLayout.NORTH); //Or choose the location from the link above
frame.add(panels, BorderLayout.CENTER);
请勿使用setLayout(null);
,因为它会删除Layout Manager,并会在不同的OS /平台上产生一些奇怪的/有趣的/怪异的/疯狂的/烦人的结果like this one。另外,请勿手动设置组件的边界,而让布局管理器替您完成:points.setBounds(450, 360, 100, 30);
不要使用它。 Null layout is evil和frowned upon
也不要忘记将程序放在EDT上,请参阅this answer