2012-04-06 23 views
5

JPanel sayfama yüklediğim bir işleyiciyi temizlemek mümkün mü? Bir yöntemi çağırdığımda, bir KeyListener'u panele koydum ama bu yöntemi bıraktığımda, dinleyiciyi temizlemek istiyorum. Sen addKeyListener (KeyListener) için tamamlanmamış bir arama varAnahtar dinleyiciyi panelden kaldır

private void stopBall(final Graphics2D g2, int posBallY, String winner) { 

     move = false; 
     scorePanel.showPressSpace(true);  

     setFocusable(true); 
     requestFocus(); 

     addKeyListener(new KeyAdapter() { 

      public void keyPressed(KeyEvent e){ 
       if (e.getKeyCode() == KeyEvent.VK_SPACE){ 

        setPosX(getPlayPanelWidth()/2); 
        setPosY(0); 

        move = true; 
        scorePanel.showPressSpace(false); 
        initBall(g2); 
       } 

      }}); 

     if (winner == "player1") { 
      scoreCountPlayer1++; 
      scorePanel.getLab_Player1().setText("" + scoreCountPlayer1); 


     } else if (winner == "comp") { 
      scoreCountComputer++; 
      scorePanel.getLab_Computer().setText("" + scoreCountComputer); 
     } 
    } 
+0

1) * "Hey guyz .." * Uluslararası forumlarda daha iyi yardım için kelimeleri doğru heceleyin. 2) Daha iyi yardım için, bir [SSCCE] (http://sscce.org/) gönderin. –

+2

* "bu yöntemi bıraktığımda .." * 'bu yöntem' stopBall() 'veya' keyPressed() 'olarak mı? Sorunu oldukça kafa karıştırıcı buluyorum. Kullanıcının neler görebileceği konusunda neyi başarmak istediğinizi açıklar mısınız? –

+1

Dizeleri '==' kullanarak karşılaştırmayın, çünkü bu iki String * nesnesinin (ve umurumda değil) bir ve aynı olup olmadığını (eğer Dizeler aynı sırada aynı karakterleri tutuyorsa) sen * yapmak * önemsemek). Bunun yerine, "eşittir (...)" veya "equalsIgnoreCase (...)" yöntemini kullanın. –

cevap

5

, bu yüzden Jpanel uzattığımızı tahmin:

İşte benim yöntemidir. Eğer öyleyse, o zaman removeKeyListener (KeyListener) çağırabilirsiniz. Mevcut kodunuzda, anahtar dinleyiciniz anonimdir. Çok gibi o referans tutunmaya değiştirmek sadece biraz gerekir:

// Create a variable holding the listener 
KeyAdapter keyAdapter = new KeyAdapter() 
{ 
    public void keyPressed(KeyEvent e) 
    { 
    if (e.getKeyCode() == KeyEvent.VK_SPACE) 
    { 
     setPosX(getPlayPanelWidth()/2); 
     setPosY(0); 

     move = true; 
     scorePanel.showPressSpace(false); 
     initBall(g2); 
    } 

    } 
}; 
// Register the listener with this JPanel 
addKeyListener(keyAdapter); 

// Time passes... 

// Remove the listener from this JPanel 
removeKeyListener(keyAdapter); 
+0

Çok teşekkürler, bu benim sorunumu çöz! – MTHeadss

0

Ya

addKeyListener(new KeyAdapter() { 
    public void keyPressed(KeyEvent e){ 
    if (e.getKeyCode() == KeyEvent.VK_SPACE){ 
     ((JPanel)e.getSource()).removeKeyListener(this); 
     setPosX(getPlayPanelWidth()/2); 
     setPosY(0); 

     move = true; 
     scorePanel.showPressSpace(false); 
     initBall(g2); 
    } 
    } 
}); 

Ama zaten belirtildiği kodunuza mutlak minimum ayarlamaları ile yol Yorumlar, keylisteners yerine keybindings seçmelisiniz