我正在用cardLayout更改“视图”(此类有一个JFrame
变量)。当用户单击新游戏按钮时,会发生以下情况:
public class Views extends JFrame implements ActionListener {
private JFrame frame;
private CardLayout cl;
private JPanel cards;
private Game game;
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("New game")) {
cl.show(cards, "Game");
game.init();
this.revalidate();
this.repaint();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
game.loop();
}
});
}
}
}
游戏的循环方法和类标题:
public class Game extends JPanel implements KeyListener {
public void loop() {
while (player.isAlive()) {
try {
this.update();
this.repaint();
// first class JFrame variable
jframee.getFrame().repaint();
// first class JFrame variable
jframee.getFrame().revalidate();
Thread.sleep(17);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void update() {
System.out.println("updated");
}
}
我在用画 paintComponent()
public void paintComponent(Graphics g) {
System.out.println("paint");
...
}
实际上,它没有画任何东西。当我不调用loop()
方法(因此它仅绘制一次)时,所有图像均正确绘制。但是当我调用loop()
方法时,窗口中什么也没有发生。(即使关闭按钮JFrame
也不起作用。)
如何解决?(当我JFrame
在游戏课程中创建游戏时,一切正常,但是现在我想拥有更多视图,因此我需要JFrame
在其他课程中使用。)
谢谢。
更新有什么作用?您可能不应该致电game.loop()
EDT。您正在EDT上运行循环,您的重绘将永远不会被调用,因为重绘会在EDT上将事件排队,并且似乎很忙。尝试移至game.loop()
另一个线程
new Thread(new Runnable() {
@override
public void run() {
game.loop();
}
}).start();
这样,您就不会在重新绘制仍要在EDT上执行的同时阻止EDT。
包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢
问题内容: 我写一个游戏循环,我发现在例如下面的代码在这里。我还研究了进行游戏循环的其他方法,例如本文。但是我无法让这些工作。因此,我保留了第一个链接中的那个。 我想知道的是: 我编写游戏循环的方式是否是实现此目标的好方法? 有什么建议? 我应该在游戏循环中使用吗? 这是我当前的代码: 问题答案: 最终,您将想要移至LWJGL之类的地方,但让我强调一下,请继续做您现在在这里所做的事情。它将教您基本
本食谱演示了使用组合流来创建游戏循环的一种方式。本食谱旨在突出如何用响应式的方式来重新思考现有问题。在这个示例中,我们将提供整体循环以及自上帧以来的增量时间。与此相结合的是用户输入流,以及当前的游戏状态,我们可以用它来更新我们的对象,并根据每帧的发出来将其渲染到屏幕上。 示例代码 ( StackBlitz ) import { BehaviorSubject, Observable, of, fr
我用Java写了Tic-Tac-Toe。我似乎遇到的问题是,当(人类)播放器1和(计算机)播放器2之间出现平局时,GUI会冻结。我已经在“Buttonlistener”类和“Methods”中创建了一个tieCheck,以获得一个平局。 我的程序的工作方式是,当按下一个按钮时,它会将一个值传递给methods类中的数组。在这个数组中,1=玩家1,2=玩家2。 人类玩家总是先走,所以当人类玩家走了4
问题内容: http://i.stack.imgur.com/XvHm5.png 当我单击“打开”按钮时,它将开始在JTextField上发送垃圾邮件1。而是冻结整个GUI,包括关闭按钮。我正在使用while循环,当您再次单击jButton时,它将停止。因为jButton被冻结,所以我无法停止该程序。我已经读过线程和多线程将有所帮助,但是所有教程都太复杂了,以至于我无法理解。他们说将循环和GUI放
问题内容: 我正在做一个游戏,我需要每3秒更新一次JProgressBar。为此,我使用while循环。问题是我的程序由于while循环而冻结(我在其他问题中读过它,它们没有帮助我解决此问题)。我不知道该怎么解决。这是我的代码: 你能帮我吗? 问题答案: 您应该在自己的线程中运行循环: 顺便说一句:如果您没有在方法中使用“ String [] args”,则没有理由在方法中声明它。