JPanel внутри JFrame иногда не показывает контент.Зачем? - PullRequest
0 голосов
/ 01 октября 2018

Мне удалось это исправить, но я не понимаю, почему один и тот же код приводит к разным результатам.У некоторых одноклассников была такая же проблема.

Проблема в том, что я использую miVentana.setVisible(true); до chicha();, элементы внутри JPanel будут отображаться при выполнении, но если я запустлю его снова, иногда они не будут видныпока я не изменил размер окна, несколько раз не было видно даже цвета фона JPanel.Просто щелкнув по нижней части «Выполнить» в IDE, не меняя ничего другого.

Я пробовал это 10 раз подряд, и элементы были видны только с 4-й попытки.

Может ли это произойти из-за некоторыхпамять, оставшаяся от предыдущих выполнений кода?

Я использую Eclipse Version: Photon Release (4.8.0).

Это код со странным поведением:

public class Ej10 extends JFrame {

    public Ej10() {
        setLayout(null);
    }

    static Ej10 miVentana = new Ej10();

    public static void main(String[] args) {
        miVentana.setTitle("Ejercicio10");
        miVentana.setBounds(20, 20, 500, 600);
        miVentana.setLocationRelativeTo(null);

        miVentana.setVisible(true);

        chicha();
        //miVentana.setVisible(true);

    }

    static void chicha() {
        JPanel miPanel = new JPanel();
        miPanel.setLayout(new BoxLayout(miPanel, BoxLayout.PAGE_AXIS));
        miPanel.setBounds(20, 20, 350, 450);
        miPanel.setBackground(Color.CYAN);

        JLabel lUsuario = new JLabel("Usuario:");
        lUsuario.setVisible(true);
        JTextField campoUsuario = new JTextField();
        JLabel lPwd = new JLabel("Contraseña:");
        JPasswordField campoPwd = new JPasswordField();
        JButton bAcceso = new JButton("Acceder");

        miPanel.add(lUsuario);
        miPanel.add(campoUsuario);
        miPanel.add(lPwd);
        miPanel.add(campoPwd);
        miPanel.add(bAcceso);

        miPanel.setVisible(true);
        miVentana.add(miPanel);
    }
}

1 Ответ

0 голосов
/ 01 октября 2018

Компоненты должны быть добавлены к фрейму ДО того, как фрейм станет видимым.

Одна из функций метода setVisible () - вызвать менеджер макета.В противном случае компоненты имеют размер (), равный (0, 0), поэтому рисовать нечего.

Кроме того, все компоненты GUI должны быть созданы на Event Dispatch Thread (EDT), в противном случае вы можете получить случайные результаты.Прочитайте раздел из учебника Swing по Параллелизм для получения дополнительной информации.

Посмотрите на FrameDemo из Как сделать кадры для самого простого примеракак ваш код должен быть структурирован, чтобы избежать проблем.В нем показано, как создавать компоненты в EDT и как сделать рамку видимой.

они не будут видны до тех пор, пока я не изменим размер окна,

Изменение размера рамкитакже вызовет вызов менеджера компоновки.

miPanel.setBounds(20, 20, 350, 450);

Этот оператор ничего не даст, потому что диспетчер компоновки фрейма будет определять размер и расположение панели на основе правил диспетчера компоновки.Диспетчером макета по умолчанию для фрейма является BorderLayout, поэтому в основном панель получит все пространство, доступное для фрейма.

В руководстве также есть раздел Layout Managers, который вы должны прочитать.

...