2013-03-06 34 views
0

我有一個帶有幾個JPanel的JFrame。一個是帶有JButtons GridLayout的boardPanel(4乘4)。另一個是controlPanel,它有一個包含一個JTextField和兩個JButton的FlowLayout。在for循環中禁用JPanel上的JComponents:令人討厭的延遲

我有兩種方法enableBoard()和disableBoard()。在這些方法中,我通過for循環setEnabled()將boardPanel和controlPanel中的每個組件設置爲true或false。這一切都發生在搖擺計時器正在運行時。當我啓動計時器並啓動enableBoard()(它通過disableBoard被禁用)時,它有點不穩定,但通常會有延遲,所以並不是所有的按鈕都會在同一時間被禁用,我懷疑它與Timer有關因爲延遲似乎在幾秒鐘內將發生的事情......下面是重要的方法:

public void disableBord() { 
    Component[] boardcomps = boardPanel.getComponents(); 
    for(int i = 0; i < bordcomps.length; i++) { 
     boardcomps[i].setEnabled(false); 
    } 

    Component[] checkComps = controlPanel.getComponents(); 
    for(int i = 0; i < checkComps.length; i++) { 
     checkComps[i].setEnabled(false); 
    } 
} 

public void enableBord() { 
    Component[] boardcomps = boardPanel.getComponents(); 
    for(int i = 0; i < bordcomps.length; i++) { 
     boardcomps[i].setEnabled(true); 
    } 

    Component[] checkComps = controlPanel.getComponents(); 
    for(int i = 0; i < checkComps.length; i++) { 
     checkComps[i].setEnabled(true); 
    } 
} 

而且運行定時器:

timer = new Timer(1000, new ActionListener() { 
     int time = game.getSeconds()+4; 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (time == game.getSeconds()+4) { 
       lblFeedback.setText("3"); 
       lblTime.setText(game.secToMinSec(game.getSeconds())); 
       time--; 
      } else if (time == game.getSeconds()+3) { 
       lblFeedback.setText("2"); 
       lbltime.setText(game.secToMinSec(game.getSeconds())); 
       time--; 
      } else if (time == game.getSeconds()+2) { 
       lblFeedback.setText("1"); 
       lblTime.setText(game.secToMinSec(game.getSeconds())); 
       time--; 
      } else if (time == game.getSeconds()+1) { 
       lblFeedback.setText("Start!"); 
       lblTime.setText(game.secToMinSec(time)); 
       time--; 
       enableBord(); 
      } else if(time == 0) { 
       lblTime.setText("0:00"); 
       lblFeedback.setText("Game finished!"); 
       disableBord(); 
       game.endeGame(); 
       timer.stop(); 
      } else if (time == game.getSeconds()) { 
       lblTime.setText(game.secToMinSec(time)); 
       time--; 
      } else { 
       lblTime.setText(game.secToMinSec(time)); 
       time--; 
      } 
     } 
    }); 

延遲看起來是這樣的:

Delay when disabling JComponents

+2

如果沒有顯示證明問題的SSCCE,沒有幫助 – kleopatra 2013-03-06 16:04:56

+0

@kleopatra這是不是足夠的信息?我只是在尋找知道可能是什麼問題的人,一個SSCCE需要一些時間,而且我的時間有點短暫:/ – 2013-03-06 16:14:26

+2

計時器每秒鐘都會啓動。啓用/禁用組件的代碼將以毫秒爲單位執行,所以我加倍定時器是個問題。它看起來像是在EDT上執行啓用/禁用代碼,這是正確的,所以我沒有看到問題可能是什麼。我們也有有限的時間,沒有所有的事實只是猜測。 – camickr 2013-03-06 16:31:02

回答

1

合適的重繪();循環中的每個setEnable()都似乎解決了我的問題!