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

时间:2009-12-19 02:09:43

标签: java

好的,所以我正在制作一个在线格斗游戏,你输入服务器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

3 个答案:

答案 0 :(得分:3)

我需要确定类层次结构是确定的,因为我不是100%关于调用update()的时间和原因,但这是我怀疑正在发生的事情。

update()被调用两次,最初一次(当您第一次显示JOptionPane时)并且由于某种原因再次被调用。可能是JOptionPane显示,销毁或者在其他组件中导致重新绘制时。

问题是,当JOptionPane显示在该线程上的执行已经停止时,所以当它关闭时,执行线程会发生疯狂的争夺,connectAndInit()经常(或总是)调用init=false到达了。如果对update()的调用来自不同的主题,则可能是始终主张。

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

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

取消init=false;中的connectAndInit()

答案 1 :(得分:0)

让我们说update()在一百个不同的主题中一次被调用一百次。 init在每个帖子中都是正确的,因此connectAndInit()将被调用一百次,因此您的对话框将显示一百次。

我不确定这是否一定会发生在这里,但很有可能。

答案 2 :(得分:0)

使用调试器的好例子。

无论如何,我的猜测是检查你设置的init变量是否未在其他地方设置,例如通过一个单独的线程。