gpt4 book ai didi

当代码只说一次时,Java JOptionPane.showInputDialog() 被多次调用

转载 作者:行者123 更新时间:2023-12-02 00:53:34 25 4
gpt4 key购买 nike

好吧,我正在制作一款在线格斗游戏,尽管代码只要求输入一次,但输入服务器 IP 的对话框不断弹出。但它不处于任何类型的循环中,所以我不知道发生了什么。

    public void connectAndInit(){
try{
String ip = JOptionPane.showInputDialog("Input server IP.");
players = new Player[MAX_PLAYERS];
players[0] = new Player(25,25,135);
players[1] = new Player(750,550,315);

ct = new ClientThread(ip, players);
ct.start();
ct.setPriority(Thread.MAX_PRIORITY);

playerNum = ct.playerNum;

init = false;
}

catch(Exception e){
e.printStackTrace();
}
}

@Override
public void update()
{
if(init)
connectAndInit();
}

这是有问题的游戏:http://prime.programming-designs.com/java/metaship-client.jnlp

这是运行游戏之前需要启动的服务器:http://prime.programming-designs.com/java/metaship-server.jnlp

最佳答案

我需要查看类层次结构才能确定,因为我不是 100% 知道 update() 何时以及为何被调用,但这是我怀疑正在发生的情况。

update() 被调用两次,一次是最初(当您第一次显示 JOptionPane 时),另一次是出于某种原因。可能是当 JOptionPane 显示、销毁时,或者当它导致其他组件中的重绘时。

问题是,虽然 JOptionPane 显示该线程上的执行已停止,所以当它关闭时,执行线程会发生疯狂的争夺,并且 connectAndInit() 经常(或总是)在之前调用已达到init=false。如果对 update() 的调用来自不同的线程,则可能是一个always命题。

要解决此问题,请将代码更改为:

if(init){
init=false;
connectAndInit();
}

并省去 connectAndInit() 中的 init=false;

关于当代码只说一次时,Java JOptionPane.showInputDialog() 被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1931704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com