我正在开发一款使用自定义控制台式GUI的游戏。我之前问了一个问题,找出导致NullPointerException的原因。有关上下文,请参阅this link。
我现在已经消除了错误,但是我有一个新问题:当我开始游戏时,GUI只加载JFrame(编辑:JPanel而不是JFrame),但没有其他组件。在原始帖子中,GUI组件正常加载,但由于在GUI分派线程完成之前调用JTextArea,启动游戏本身会导致NullPointerException。
以下是当前代码:
Classic.java
import javax.swing.*;
import java.util.*;
import static javax.swing.SwingUtilities.invokeLater;
public class Classic extends Game{
private static JFrame gui;
private static GUIClassic newContentPane;
...
public void play() {
invokeLater(Classic::startGUI);
invokeLater(Classic::startGame);
}
public static void startGame() {
//Game processes
...
}
private static void startGUI() {
gui = new JFrame("Karma :: Classic Mode");
gui.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
newContentPane = new GUIClassic();
newContentPane.setOpaque(true);
gui.setContentPane(newContentPane);
gui.pack();
gui.setVisible(true);
}
...
}
GUIClassic.java
...
public class GUIClassic extends JPanel implements ActionListener {
private JTextArea output;
private JTextField input;
private boolean inputReady;
private String inputText;
public GUIClassic() {
super();
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
output = new JTextArea(15, 15);
output.setEditable(false);
JScrollPane outputScroll = new JScrollPane(output);
input = new JTextField("",40);
add(outputScroll);
add(Box.createRigidArea(new Dimension(0,5)));
add(input);
}
}
在Classic.java的play()
方法中,我尝试删除提出相同结果的invokeLater(...)
方法。
public void play() {
startGUI();
startGame();
}
我也尝试将来电转移到startGame
内的startGUI
:
public static void startGUI() {
...
startGame();
}
但是,完全删除startGame
可以让它正常启动:
public void play() {
invokeLater(Classic::startGUI);
}
我完全不知所措。我不明白为什么在不玩游戏的情况下加载GUI会加载它很好,但是开始游戏会突然使组件消失。
请注意:运行期间不会抛出异常。
作为旁注,GUI也不允许我通过当前版本的[X]按钮关闭它,但在只有' startGUI'被调用,组件弹出,[X]允许你退出。
答案 0 :(得分:0)
您永远不会设置Panel的大小。
在调用JFrame的setPreferredSize(Dimension)
- 方法之前,请尝试使用GUIClassic的pack()
方法。