JFrame отображается пустым после замены JFrames дважды (с помощью Intellij GUI Designer) - PullRequest
0 голосов
/ 30 октября 2019

Я относительно новичок в Java Swing в целом и решил использовать GUI Designer от Intellij. Для тех, кто не знаком с ним, Intellij создает 2 файла для каждого «экрана» графического интерфейса. Одним из них является «дизайн» в виде .form файла, в который вы перетаскиваете компоненты пользовательского интерфейса, а другим - «контроллер».

В любом случае, я делаю 5-этапную анкету, реализованную наJava Swing. Первая часть спрашивает пользователя, какой у него любимый фрукт, и когда нажимается кнопка выбора, выбор сохраняется, и появляется следующий JFrame со следующим вопросом и так далее. Переход JFrame1 к JFrame2 работал нормально, и все компоненты пользовательского интерфейса были показаны. Однако, когда я попытался перейти от JFrame2 к JFrame3, JFrame3 вместо этого показывал пустое значение.

Empty JFrame at second transition

Я пытался вызвать .pack() до setVisible(true), а затем позвонив .toFront() после этого, но это не помогло.

Ниже показан раздел моего кода. JFrame1, 2 и 3 используют один и тот же точный код в своих конструкторах и вызове следующего JFrame. JFrame1 отличается только одной строкой, которая будет указана позже в коде.

JFrame1.java

public class Frame1 extends JFrame {
    private JPanel mainPanel;
    private JLabel narrationLabel;
    private JButton option1_btn;
    private JButton option2_btn;
    private JButton option3_btn;

    public Frame1()
    {
        setTitle("Questionnaire");
        setSize(1000, 1000);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Frame2 nextScreen = new Frame2 (); //declare the next screen to show

        add(mainPanel); //this is only for the first starting JFrame
                        //JFrame2 and JFrame3 do not have this

        //repeat this for buttons option2_btn and option3_btn
        option1_btn.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                //swap screens to the next main filler selection screen
                mainPanel.setVisible(false);
                nextScreen.pack();                
                add(nextScreen.getPanel());
                nextScreen.getPanel().setVisible(true);
            }
        });
    }

    public JPanel getPanel() 
    {
        return mainPanel;
    }
}

Main.java

public class Main
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame1 frame1 = new JFrame1(); //create start screen GUI
                frame1.setVisible(true); //display GUI
            }
        });
    }
}

Моя догадка говорит мне, что может проблема параллелизма, но я не уверен, прав ли я, или где проблема и как ее решить. Если нужен файл .form, я с удовольствием выложу для него код. Любая помощь приветствуется.

...