Java JOptionPane.showInputDialog()在代码只显示一次时被多次调用

Java JOptionPane.showInputDialog()在代码只显示一次时被多次调用,java,Java,好的,我正在制作一个在线格斗游戏,你输入服务器IP的对话框不断弹出,即使代码只要求它一次。但这并不是什么循环,所以我不知道发生了什么 public void connectAndInit(){ try{ String ip = JOptionPane.showInputDialog("Input server IP."); players = new Player[MAX_PLAYERS];

好的,我正在制作一个在线格斗游戏,你输入服务器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();
    }
下面是有问题的游戏:

这是运行游戏之前需要启动的服务器:

比方说,
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()