2013-06-20 4 views
1

так что я делаю шахматную игру, но только с рыцарем.Как удалить прослушиватель действий?

это метод для перемещения рыцаря

public void caballo(final int row, final int column) { 

     final JButton current = mesa[row][column]; 

     current.setIcon(image); 
     panel.repaint(); 

     acciones(row, column, current); 
    } 

    public void acciones(final int row, final int column, final JButton current) { 

     for (int i = 0; i < HEIGHT; i++) { 
      for (int j = 0; j < WIDTH; j++) { 
       mesa[i][j].addActionListener(e(row, column, current)); 



      } 
     } 
    } 

    public ActionListener e(final int row, final int column, 
      final JButton current) { 
     return new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       if (tienebotton(row + 2, column + 1)) { 
        if (e.getSource() == mesa[row + 2][column + 1]) { 

         current.setIcon(null); 
         caballo(row + 2, column + 1); 
         ((AbstractButton) e.getSource()).setEnabled(false); 

        } 
       } 
       if (tienebotton(row + 2, column - 1)) { 
        if (e.getSource() == mesa[row + 2][column - 1]) { 

         current.setIcon(null); 
         caballo(row + 2, column - 1); 

         ((AbstractButton) e.getSource()).setEnabled(false); 

        } 
       } 
       if (tienebotton(row - 2, column - 1)) { 
        if (e.getSource() == mesa[row - 2][column - 1]) { 

         current.setIcon(null); 
         caballo(row - 2, column - 1); 

         ((AbstractButton) e.getSource()).setEnabled(false); 

        } 
       } 
       if (tienebotton(row - 2, column + 1)) { 
        if (e.getSource() == mesa[row - 2][column + 1]) { 

         current.setIcon(null); 
         caballo(row - 2, column + 1); 

         ((AbstractButton) e.getSource()).setEnabled(false); 

        } 
       } 

       if (tienebotton(row + 1, column + 2)) { 
        if (e.getSource() == mesa[row + 1][column + 2]) { 

         current.setIcon(null); 
         caballo(row + 1, column + 2); 

         ((AbstractButton) e.getSource()).setEnabled(false); 

        } 
       } 
       if (tienebotton(row - 1, column + 2)) { 
        if (e.getSource() == mesa[row - 1][column + 2]) { 

         current.setIcon(null); 
         caballo(row - 1, column + 2); 

         ((AbstractButton) e.getSource()).setEnabled(false); 

        } 
       } 
       if (tienebotton(row + 1, column - 2)) { 
        if (e.getSource() == mesa[row + 1][column - 2]) { 

         current.setIcon(null); 
         caballo(row + 1, column - 2); 

         ((AbstractButton) e.getSource()).setEnabled(false); 

        } 
       } 
       if (tienebotton(row - 1, column - 2)) { 
        if (e.getSource() == mesa[row - 1][column - 2]) { 

         current.setIcon(null); 
         caballo(row - 1, column - 2); 

         ((AbstractButton) e.getSource()).setEnabled(false); 

        } 
       } 
      } 
     }; 
    } 

    public boolean tienebotton(int row, int column) { 
     return (row >= 0 && row < HEIGHT && column >= 0 && column < WIDTH); 

    } 
} 

моя проблема заключается в том, что, когда я переместить часть в первый раз новые рыцари появляются, были, я мог бы переместить его раньше. Поэтому я подумал, может быть, если я удалю actionlistener внутри метода выполнения действия, я могу это исправить. Как вы думаете? Im новой для Java жаль, если это глупый вопрос, сказал

+6

Вы удаляете actionListener, как это .. component.removeActionListener (theActionListenerYouWantToRemove) – nachokk

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

2

Как nachokk, вы должны использовать: component.removeActionListener(theActionListenerYouWantToRemove)

Вот как вы можете использовать его в e метод:

public ActionListener e(final int row, final int column, 
     final JButton current) { 
    return new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

      current.setIcon(null); 
      if (tienebotton(row + 2, column + 1)) { 
       if (e.getSource() == mesa[row + 2][column + 1]) { 
        caballo(row + 2, column + 1); 
       } 
      } 
      if (tienebotton(row + 2, column - 1)) { 
       if (e.getSource() == mesa[row + 2][column - 1]) { 
        caballo(row + 2, column - 1); 
       } 
      } 
      if (tienebotton(row - 2, column - 1)) { 
       if (e.getSource() == mesa[row - 2][column - 1]) { 
        caballo(row - 2, column - 1); 
       } 
      } 
      if (tienebotton(row - 2, column + 1)) { 
       if (e.getSource() == mesa[row - 2][column + 1]) { 
        caballo(row - 2, column + 1); 
       } 
      } 

      if (tienebotton(row + 1, column + 2)) { 
       if (e.getSource() == mesa[row + 1][column + 2]) { 
        caballo(row + 1, column + 2); 
       } 
      } 
      if (tienebotton(row - 1, column + 2)) { 
       if (e.getSource() == mesa[row - 1][column + 2]) { 
        caballo(row - 1, column + 2); 
       } 
      } 
      if (tienebotton(row + 1, column - 2)) { 
       if (e.getSource() == mesa[row + 1][column - 2]) { 
        caballo(row + 1, column - 2); 
       } 
      } 
      if (tienebotton(row - 1, column - 2)) { 
       if (e.getSource() == mesa[row - 1][column - 2]) { 
        caballo(row - 1, column - 2); 
       } 
      } 
      ((AbstractButton) e.getSource()).setEnabled(false); 
      ((AbstractButton) e.getSource()).removeActionListener(this); 
     } 
    }; 
} 

Я вижу, что вы новичок в Java, вы заметите, что я немного изменил ваш метод e только для вызова current.setIcon(null); и ((AbstractButton) e.getSource()).setEnabled(false);. Я также удостоверился, что прослушиватель удаления действий вызывается только один раз, вы должны стараться избегать дублирования кода насколько это возможно.