5

に付けたリスナーをクリアすることはできJPanelますか? メソッドを呼び出すときKeyListenerはパネルに配置しますが、このメソッドを終了するときにそのリスナーをクリアしたいです。

これが私の方法です:

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

2 に答える 2

5

addKeyListener(KeyListener) への修飾されていない呼び出しがあるため、JPanel を拡張したと推測されます。その場合は、removeKeyListener(KeyListener) を呼び出すことができます。現在のコードでは、キー リスナーは匿名です。その参照を保持するには、次のように少し変更する必要があります。

// 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);
于 2012-04-06T17:28:35.007 に答える
0

または、コードへの絶対的な最小限の調整を行う方法

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

ただし、コメントで既に述べたように、キーリスナーの代わりにキーバインディングを選択する必要があります

于 2012-04-06T18:40:20.737 に答える