Java - обработка событий mouseMoved() в Swing

Я хочу слушать движения мыши и щелчки в моем JFrame. Для этого я добавил MouseListener, реализованный следующим образом: (весь код класса View находится по адресу https://gist.github.com/2837224, класс Board находится по адресу https://gist.github.com/2837231< /а>)

class BattleshipsFrame extends JFrame {
  private final Board playerBoard, opponentBoard;
  private View view;

/** Main window constructor. */
BattleshipsFrame() {
  ...
  ...   
  ...
  //creating and displaying boards
  playerBoard = new Board();
  opponentBoard = new Board();
  PlayerBoardListener mouseListener = new PlayerBoardListener();
  this.addMouseListener(mouseListener);
  playerBoard.addMouseListener(mouseListener);
  opponentBoard.addMouseListener(new OpponentBoardListener());
  boards.add(playerBoard);
  boards.add(opponentBoard);
  ...
  ...
  ...
}

/** Listener responsible for handling mouse events on player board */
private class PlayerBoardListener extends MouseAdapter {
  @Override public void mousePressed(MouseEvent event) {
    try {
      if(event.getButton() == MouseEvent.BUTTON1 && controllerConnection != null)
        controllerConnection.sendShipPlacedEvent(event.getX()/40, event.getY()/40, ShipType.EMPTY);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }   
  @Override public void mouseMoved(MouseEvent event) {
    //TODO
    System.out.println("Mouse movement detected! Actual mouse position is: " + event.getX()+ "," + event.getY() + ".");
  }   
  @Override public void mouseDragged(MouseEvent event) {
    //TODO
    System.out.println("Mouse movement detected! Actual mouse position is: " + event.getX()+ "," + event.getY() + ".");
  }   

}

Забавно, что mousePressed() работает хорошо, а два других — нет (ничего не отображается на консоли при перемещении мыши). Кто-нибудь может сказать мне, что я делаю неправильно? Заранее спасибо!


person mc.suchecki    schedule 30.05.2012    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 30.05.2012
comment
ничего лучше постить тут и SSCCE не ссылку куда-то на универсум, это про будущих читателей,   -  person mKorbel    schedule 30.05.2012
comment
Спасибо за интересную ссылку. На мой взгляд, рабочий пример будет слишком длинным, я разместил весь код в ссылках сверху.   -  person mc.suchecki    schedule 30.05.2012
comment
На самом деле хорошо сделанный рабочий пример будет коротким. Для простых вопросов вам, скорее всего, это не понадобится, но для сложных вопросов это то, что нам самим, вероятно, придется сделать, чтобы помочь решить, поэтому лучше, если вы сделаете это для нас. Удача.   -  person Hovercraft Full Of Eels    schedule 30.05.2012
comment
Хорошо, я буду иметь это в виду в следующий раз.   -  person mc.suchecki    schedule 30.05.2012


Ответы (2)


Если вы хотите получать события mouseMoved и mouseDragged, вам также необходимо зарегистрировать прослушиватель как MouseMotionListener.

MouseAdapter adapter = ...
JFrame frame = ...
frame.addMouseListener(adapter);
frame.addMouseMotionListener(adapter);
person Jeffrey    schedule 30.05.2012
comment
Это сработало! Я должен читать документацию внимательнее в следующий раз. Однако - большое спасибо! - person mc.suchecki; 30.05.2012

Может стоит попробовать реализовать MouseMotionListener и с MouseListener тоже?

person Joe    schedule 30.05.2012
comment
Я уже пробовал это, и это одно и то же, поскольку MouseAdapter реализует как MouseMotionListener, так и MouseListener. Решение уже на высоте. ;-) - person mc.suchecki; 30.05.2012