解决方案删除了​​我的JPanel继承的类。为什么?

时间:2019-06-06 18:26:29

标签: java swing jframe jpanel jlabel

我正在将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 个答案:

答案 0 :(得分:2)

  

我的代码仅显示了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,并会在不同的OS /平台上产生一些奇怪的/有趣的/怪异的/疯狂的/烦人的结果like this one。另外,请勿手动设置组件的边界,而让布局管理器替您完成:points.setBounds(450, 360, 100, 30);不要使用它。 Null layout is evilfrowned upon

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

  5. 上的第2点