Java程序重新启动,关于Java:如何使用JOptionPane重新启动应用程序?

因此,当玩家在我的游戏中死亡时,我希望弹出窗口询问他们是否要重启或退出。 NO和CANCEL选项工作正常(System.exit(0)),但是YES选项是我遇到麻烦的地方。 当是时,我称主游戏

private void playerHealth() {

JDialog.setDefaultLookAndFeelDecorated(true);

if (player.health <= 0) {

int response = JOptionPane.showConfirmDialog(null,"Do you want to continue?","Confirm",

JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

if (response == JOptionPane.NO_OPTION) {

System.exit(0);

}

else if (response == JOptionPane.YES_OPTION) {

new Game().start();

}

else if (response == JOptionPane.CLOSED_OPTION) {

System.exit(0);

}

}

}

使用我的启动器类中的一行

package core;

public class Launcher {

public static void main(String[] args){

//Launches new Game

new Game().start();

}

}

并重新启动,但弹出窗口不会消失。 游戏无法再次玩,我必须退出并重新开始。 如果有人可以找出一种方法,可以在单击"是"后再次停止弹出提示,那将是很好的。

谢谢

编辑:我把

player.health = 100;

在代码中:

else if (response == JOptionPane.YES_OPTION) {

player.health = 100;

new Game().start();

}

这似乎可以解决问题。 但是,我现在遇到了一个完全不同的问题,因为每次都启动一个新应用,而旧应用不会被删除。 有没有办法删除旧游戏并开始新游戏?

谢谢

在理想情况下,从您在此处输入的代码中,弹出窗口应该消失。问题可能出在另一个地方。尝试提供一个可以轻松重现该问题的代码。话虽如此,您应该重新考虑这种设计,这只会继续为另一个游戏对象中的每个"是"选项创建新的游戏对象。

我会尝试在某个地方重新创建它,但是每次我单击YES时,您都会提出一个关于创建另一个游戏对象的有趣观点。无论如何,有没有删除旧的并开始新的?

您可以在另一个线程中启动new Game().start();。这样,当前线程将继续执行并完成操作(从而收集垃圾)。或者,实际上,您可以具有重启机制,在该机制中您可以使用相同的对象,而只需重置所有变量和值。

通知旧游戏停止的另一种方法是使用观察者模式。例如,playerHealth将在玩家死亡时通知游戏它需要关闭。

@LaurentB有趣。这在我的代码中如何工作?抱歉,我一点都不精通Java

在注释中解释太久了,请看一下Java中的ActionListener及其用法。开始良好的编码习惯是一个很好的话题

查看health变量。

如果您告诉弹出窗口再次显示,则此情况:

player.health <= 0

重新启动后必须为true。因此,我希望player或health变量是静态的,并且静态变量也必须重新启动

我不相信它设置为静态

同意,具有这种行为不必是静态的

@LaurentB也同意,可能有更多的原因导致它,这也是您的一个想法。 我的回答只是可能导致此问题的想法之一。

我认为问题不在您的playerHealth方法的代码中。这应该工作得很好。

问题在于,可能在代码的其他地方,您不断回拨playerHealth。

也许您应该考虑将game实例传递给玩家健康状况,并调用game.restart(),该实例应停止调用playerHealth方法并完全重新启动游戏(也许通过game.start())。

总而言之,您的代码不错,但是很可能您在某个地方对playerHealth的调用是错误的。

编辑:如果您想使用观察者之类的模式来通知game实例它需要停止,请看一下这篇文章:Javas核心库中的GoF设计模式示例

特别是ActionListener实例。

好主意+1,否则我认为只有在旧对象中丢失另一个线程或代码中某个地方丢失引用的情况下,这才有可能

不,我没有在最后一行(游戏的更新)以外的任何地方致电playerHealth。 如果我将其取出,player.health将继续超过0并且不会停止。

所以您是说方法在游戏类中?

@LaurentB是的,这是正确的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值