Setlayout удаляет мой унаследованный класс JPanel.Зачем? - PullRequest
1 голос
/ 06 июня 2019

Я добавляю и 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();
    }
}

1 Ответ

2 голосов
/ 06 июня 2019

Мой код показывает только один из двух компонентов, унаследованный класс JLabel или JPanel.

Поскольку JFrame имеет макет BorderLayout по умолчанию. И если вы не укажете местоположение в BorderLayout, он добавит элементы в позицию CENTER.

Итак:

  1. Я настоятельно рекомендую не расширять JFrame и лучше создавать его экземпляр в своем классе, так как вы все равно не изменяете его поведение.

  2. Добавьте ваши компоненты как

    frame.add(points, BorderLayout.NORTH); //Or choose the location from the link above
    frame.add(panels, BorderLayout.CENTER);
    
  3. Не используйте setLayout(null);, так как он удалит Диспетчер макетов и даст некоторые странные / смешные / странные / сумасшедшие / раздражающие результаты как этот в разные ОС / Платформа. Также не устанавливайте вручную границы ваших компонентов, пусть менеджер раскладок сделает это за вас: points.setBounds(450, 360, 100, 30); не используйте его. Нулевое расположение - зло и хмурится

  4. А также не забудьте поместить свою программу в EDT, см. Пункт №2 в этот ответ

...