2009-12-19 113 views
0

好吧,所以我在制作一个在线格斗游戏,并且输入服务器IP的对话框不断弹出,即使只是代码要求一次。尽管它没有任何循环,所以我不知道发生了什么。Java JOptionPane.showInputDialog()当代码只说一次时不止一次调用

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

+0

什么是类层次结构? – 2009-12-19 02:17:39

+0

何时更新被调用? – ChadNC 2009-12-19 02:30:03

回答

0

假设update()一次被称为百倍在一百个不同的线程中。 init将在每个线程中都为true,因此connectAndInit()将被调用一百次,因此您的对话框将显示一百次。

我不确定这是否一定是这里发生的事情,但它很可能。

0

使用调试器的好例子。

无论如何,我的猜测是检查你设置的初始化变量没有设置在别处,例如,由一个单独的线程。

3

我需要看到类层次结构是肯定的,因为我不是100%的时间,为什么update()被调用,但这是我怀疑发生的事情。

update()正在被调用两次,一次最初(当你第一次显示你的JOptionPane),再次出于某种原因。可能当JOptionPane显示,销毁,或当它导致在其他组件重绘。

的疑难杂症是,虽然JOptionPane的显示在该线程停止执行的,所以它关闭时有执行线程疯抢和connectAndInit()经常(或总是)被称为达到init=false之前。如果对update()的呼叫来自不同的线程,则可能是一个总是命题的

为了解决这个问题,你的代码更改为:

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

而且,随着connectAndInit()init=false;免除。

+0

+1,因为提供的代码也是我的猜测。 – PSpeed 2009-12-19 02:26:37