Java JOptionPane.showInputDialog()在代码只显示一次时被多次调用
好的,我正在制作一个在线格斗游戏,你输入服务器IP的对话框不断弹出,即使代码只要求它一次。但这并不是什么循环,所以我不知道发生了什么Java JOptionPane.showInputDialog()在代码只显示一次时被多次调用,java,Java,好的,我正在制作一个在线格斗游戏,你输入服务器IP的对话框不断弹出,即使代码只要求它一次。但这并不是什么循环,所以我不知道发生了什么 public void connectAndInit(){ try{ String ip = JOptionPane.showInputDialog("Input server IP."); players = new Player[MAX_PLAYERS];
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();
}
下面是有问题的游戏:
这是运行游戏之前需要启动的服务器:比方说,update()
在一百个不同的线程中一次调用一百次init
在每个线程中都是true,因此connectAndInit()
将被调用一百次,因此您的对话框将显示一百次
我不确定这是否一定是这里发生的事情,但很可能是这样。比如说,update()
在一百个不同的线程中同时被调用一百次init
在每个线程中都是true,因此connectAndInit()
将被调用一百次,因此您的对话框将显示一百次
我不确定这是否一定是这里发生的事情,但很可能是这样。使用调试器的好例子
无论如何,我的猜测是检查您正在设置的init变量是否未在其他地方设置,例如,由单独的线程设置。使用调试器很好
无论如何,我的猜测是检查您正在设置的init变量是否未在其他地方设置,例如,通过单独的线程设置。我需要查看类层次结构以确定,因为我不是100%了解调用
update()
的时间和原因,但我怀疑发生了什么
update()
将被调用两次,一次是最初调用(当您第一次显示作业窗格时),另一次是出于某种原因调用。可能是当JOptionPane
被显示、销毁,或者当它导致在某些其他组件中重新绘制时
问题是,当显示JOptionPane时,该线程上的执行已停止,因此当它关闭时,会出现对执行线程的疯狂争夺,并且在到达init=false
之前经常(或始终)调用connectAndInit()
。如果对update()
的调用来自不同的线程,这可能是一个始终的命题
要解决此问题,请将代码更改为:
if(init){
init=false;
connectAndInit();
}
并且省去了init=false
在connectAndInit()
中,我需要查看类的层次结构才能确定,因为我不是100%了解调用update()
的时间和原因,但下面是我怀疑正在发生的事情
update()
将被调用两次,一次是最初调用(当您第一次显示作业窗格时),另一次是出于某种原因调用。可能是当JOptionPane
被显示、销毁,或者当它导致在某些其他组件中重新绘制时
问题是,当显示JOptionPane时,该线程上的执行已停止,因此当它关闭时,会出现对执行线程的疯狂争夺,并且在到达init=false
之前经常(或始终)调用connectAndInit()
。如果对update()
的调用来自不同的线程,这可能是一个始终的命题
要解决此问题,请将代码更改为:
if(init){
init=false;
connectAndInit();
}
并且省去了init=false代码>在connectAndInit()
中