2009-12-19 75 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