加载另一个方法时,GUI组件不会加载

时间:2015-08-26 15:06:36

标签: java swing user-interface

我正在开发一款使用自定义控制台式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]允许你退出。

1 个答案:

答案 0 :(得分:0)

您永远不会设置Panel的大小。 在调用JFrame的setPreferredSize(Dimension) - 方法之前,请尝试使用GUIClassic的pack()方法。