2012-04-06 42 views
5

Có thể xóa người nghe mà tôi đặt trên JPanel của mình không? Khi tôi gọi một phương thức, tôi đặt KeyListener trên bảng điều khiển nhưng khi tôi thoát khỏi phương thức này, tôi muốn xóa người nghe đó.Xóa người nghe chính khỏi bảng điều khiển

Đây là phương pháp của tôi:

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 .." * Để được trợ giúp tốt hơn trên các diễn đàn quốc tế, hãy đánh vần đúng từ. 2) Để được trợ giúp tốt hơn sớm hơn, hãy đăng một [SSCCE] (http://sscce.org/). –

+2

* "khi tôi thoát phương thức này .." * 'phương thức này' là 'stopBall()' hoặc 'keyPressed()'? Tôi thấy câu hỏi của bạn khá khó hiểu. Bạn có thể giải thích những gì bạn muốn đạt được về những gì người dùng có thể thấy không? –

+1

Không so sánh các chuỗi bằng cách sử dụng '==' như kiểm tra nếu hai đối tượng String * là một và giống nhau (mà bạn không quan tâm), không phải nếu các chuỗi giữ các ký tự giống nhau trong cùng một thứ tự (bạn * làm * quan tâm). Thay vào đó, hãy sử dụng phương thức String 'equals (...)' hoặc 'equalsIgnoreCase (...)'. –

Trả lời

5

Bạn có một cuộc gọi không đủ tiêu chuẩn để addKeyListener (KeyListener), vì vậy tôi đoán rằng bạn đã mở rộng JPanel. Nếu vậy, bạn có thể gọi removeKeyListener (KeyListener). Trong mã hiện tại của bạn, trình nghe chính của bạn là ẩn danh. Bạn sẽ cần phải thay đổi nó chỉ là một chút để giữ cho tài liệu tham khảo mà, như vậy:

// 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

Cảm ơn rất nhiều, giải quyết vấn đề của tôi !! – MTHeadss

0

Hoặc cách với những điều chỉnh tối thiểu tuyệt đối để mã của bạn

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); 
    } 
    } 
}); 

Nhưng như đã được nêu trong các ý kiến, bạn nên lựa chọn keybindings thay vì keylisteners

Các vấn đề liên quan