Я относительно новичок в Java Swing в целом и решил использовать GUI Designer от Intellij. Для тех, кто не знаком с ним, Intellij создает 2 файла для каждого «экрана» графического интерфейса. Одним из них является «дизайн» в виде .form
файла, в который вы перетаскиваете компоненты пользовательского интерфейса, а другим - «контроллер».
В любом случае, я делаю 5-этапную анкету, реализованную наJava Swing. Первая часть спрашивает пользователя, какой у него любимый фрукт, и когда нажимается кнопка выбора, выбор сохраняется, и появляется следующий JFrame со следующим вопросом и так далее. Переход JFrame1 к JFrame2 работал нормально, и все компоненты пользовательского интерфейса были показаны. Однако, когда я попытался перейти от JFrame2 к JFrame3, JFrame3 вместо этого показывал пустое значение.
![Empty JFrame at second transition](https://i.stack.imgur.com/wS6Qi.png)
Я пытался вызвать .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
, я с удовольствием выложу для него код. Любая помощь приветствуется.