我目前正在用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);
}
定义所有变量,尺寸等。
我认为可能是某些变量未定义,或者我没有将其设置为可见,但这似乎是错误的。
这个窗口怎么没出现?我误读了一些文章和文档吗?
感谢。
答案 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