当前位置: 首页 > 面试题库 >

Java-Swing中的mouseMoved()事件处理

葛霄
2023-03-14
问题内容

我想在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()运行良好,但其他两个运行不正常(移动鼠标时控制台上没有任何显示)。有人可以告诉我我在做什么错吗?提前致谢!


问题答案:

如果您想接收mouseMovedmouseDragged事件,还需要将侦听器注册为MouseMotionListener

MouseAdapter adapter = ...
JFrame frame = ...
frame.addMouseListener(adapter);
frame.addMouseMotionListener(adapter);


 类似资料:
  • 问题内容: 可以以标准方式执行此操作吗? 这是场景。 开始在EDT中执行一些昂贵的操作(EDT被阻止,直到昂贵的操作结束为止)。 在阻止EDT的同时,用户继续单击/拖动鼠标按钮。所有鼠标动作都记录在某处。 当EDT免费时(用昂贵的东西完成),它开始处理鼠标事件。 我在步骤3中想要的是丢弃堆积的鼠标事件。EDT释放后,任何新的鼠标事件都应按常规方式处理。 关于如何实现这一目标的任何想法。 PS:对于

  • 我已经在JList上有一个这样的自定义控件库 但是我希望Jlist有滚动条,所以我将自定义控件的超类更改为JScrollPane并将JList添加到其中。像这样的代码 好吧,如果MyClass扩展了JList,在JFrame中我可以将MouseListener添加到MyClass对象中,在mouseClick中我比较MouseEvent getSource是MyClass的一个实例并调用MyCla

  • 问题内容: 我在Java中为simpleGUI编写了一个小代码。 我是JAVA的新手。与此程序相关的问题很少。 有人可以解释一下actionPerformed方法如何在没有任何调用的情况下执行吗? 在这里,我在go()方法的本地定义了框架对象,我们在actionPerformed中使用了按钮,这是另一种方法,那怎么可能呢?按钮没有嵌入框架吗? 谢谢.. 问题答案: 有人可以解释一下actionPe

  • 问题内容: 在通过单击发送按钮或在一段代码的消息文本字段中按Enter的方法中,我有以下代码。 最后的代码使文本区域空白。但是,通过按Enter键发送消息后,文本框将包含换行符,而不是为空。 我的猜测是,在事件处理程序运行之后,然后添加了换行符。如何停止添加换行符? 问题答案: 致电后尝试添加

  • 问题内容: 也许我在这里想解释的没有任何意义,所以我想提前道歉。无论如何,我会尽力的。 我试图读取文件,执行一些数据库操作,然后将内容移动到另一个文件。我想知道是否有可能在Java中以原子方式执行所有这些操作,因此,如果操作列表中有任何错误,请回滚完整序列并返回到起点。 在此先感谢您的帮助。 问题答案: 看一下Apache Commons Transaction 。它具有事务性管理文件的功能。 一

  • 具有事件源的CQR看起来非常适合作为我们的一个系统的架构,目前我们只担心一件小事:处理大量事件,并因此处理大型事件商店。 我们当前的系统每天接收大约一百万个事件(目前与事件源无关),如果我们将它们存储在更长的时间内,我们的事件存储可能会变得相当大,但是如果我们经常转储/清除滚动快照,我们可能会失去事件源的一大优势:关于系统历史和重播的信息。 在CQRS架构中处理这个问题的常见方法是什么?这到底是个