JFrame窗口没有显示?

时间:2016-03-17 08:15:51

标签: java swing jframe

我目前正在用Java构建一个太空入侵者风格的游戏。它是我的第一个,所以我试图理解它。主要要求是它在桌面上运行。

现在我正在尝试使用jFrame,但这并不是让我做我想做的事情。当我运行我的应用程序时,它确实显示在我的Dock中运行的java“app”(我运行OSX),但实际的jFrame窗口没有显示。

这是我创建窗口的方式:

public GildeInvaders() {
    add(new Panel());
    setTitle("Gilde Opleidingen Space Invaders");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(500, 500);
    //setSize(GildeInvaders.getConfiguration().getInt("game.width"), 

    GildeInvaders.getConfiguration().getInt("game.height"));
    setLocationRelativeTo(null);
    setVisible(true);
    setResizable(true);
}

public static void main(final String[] args) throws IOException {
    new GildeInvaders();
}

我发起的Panel是jPanel的一个实例,我认为这是正确的方法:

public class Panel extends JPanel implements Runnable {
    // Lot of variables here


    public Panel() {
        addKeyListener(new TAdapter());
        setFocusable(true);
        dimension = new Dimension(GildeInvaders.getConfiguration().getInt("game.width"), GildeInvaders.getConfiguration().getInt("game.height"));
        setBackground(Color.black);
        this.initiate();
        setDoubleBuffered(true);
    }

定义所有变量,尺寸等。

我认为可能是某些变量未定义,或者我没有将其设置为可见,但这似乎是错误的。

这个窗口怎么没出现?我误读了一些文章和文档吗?

感谢。

2 个答案:

答案 0 :(得分:2)

您的代码适用于我(当然,在删除了游戏特定的内容之后)。

也许这是一个线程问题。 您可以尝试以这种方式调用JFrames构造函数:

public static void main(final String[] args) throws IOException {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            new GildeInvaders();        
        }
    });
}

答案 1 :(得分:2)

JPanel是一个Swing组件,每个Swing组件必须至少有一个顶级容器。您应该使用JFrame作为顶级容器来创建框架,并且可以添加像JPanel这样的Swing组件。要使框架显示,您应该使用SwingUtilites.invokeLater()方法,以便在AWT事件分派线程上异步执行。这是一个很好的例子:https://docs.oracle.com/javase/tutorial/uiswing/examples/components/FrameDemoProject/src/components/FrameDemo.java