在 Java 中停止 MouseMoved 事件

Stopping MouseMoved Event in Java

我在学校做一个项目,我有一个特殊的功能要实现,但有一些问题。我需要做的是检查 SQL 数据库中剩余的床位数量,如果它低于临界数量,则会出现 JOptionPane。

我想做的是另一个更难的场景,打开2帧。例如,第一帧用户使用床,它会下降到临界值 10,在另一帧当用户移动他的鼠标箭头时,JOptionPane 将弹出显示一条消息。

我在这个社区中查找过,但我似乎无法实施代码以使其正常工作。我已经到了没有错误的地步,但我似乎无法关闭 JOptionPane。基本上我只希望只有当任一帧的用户低于床位计数时才触发此事件。

我是这个动作事件的新手。我正在使用 MySQL 数据库将这个项目作为 3 层编程。

我查看了这些网站,但无济于事:

How to temporarily disable event listeners in Swing?

显示 JOptionPane 的框架代码

public HomePageForm() {
    setTitle("Home");
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    setBounds(100, 100, 640, 428);
    contentPane = new JPanel();
    contentPane.addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseMoved(MouseEvent e) {

            String cardioMsg = "Beds are running out for Cardiothoracic Department!";
            String oncoMsg = "Beds are running out for Oncology Department!";
            String orthoMsg = "Beds are running out for Orthopaedic Department!";
            String pediaMsg = "Beds are running out for Pediatric Department!";

            if (ignoreMouseMovedEvents) {
                return;
            }

            ArrayList<ChangeBed> bedList = new ArrayList<ChangeBed>();

            ChangeBedControl cbc8 = new ChangeBedControl();

            bedList = cbc8.processCountBedsAvailableDpt4();

            for (int i = 0; i < bedList.size(); i++) {

                bedsForPediatric = bedList.get(i).getRowCountAvail();

            }

            if (bedsForPediatric <= 3) {

                int valuePedia = JOptionPane.showConfirmDialog(null, pediaMsg, "URGENT", JOptionPane.WARNING_MESSAGE);

                if (valuePedia == 0 || valuePedia == 2) {
                    ignoreMouseMovedEvents = true;
                    valuePedia = JOptionPane.CLOSED_OPTION;
                }

            }   

        }
    });

控制器代码Class

public ArrayList<ChangeBed> processCountBedsAvailableDpt4() {

    ChangeBed changeBed = new ChangeBed();

    ArrayList<ChangeBed> bedList = new ArrayList<ChangeBed>();

    bedList = changeBed.countBedsAvailableDpt4();

    return bedList;

}

要从 SQL 数据库中检索的实体 class

public ArrayList<ChangeBed> countBedsAvailableDpt4() {

    ArrayList<ChangeBed> bedList = new ArrayList<ChangeBed>();

    boolean rowBooleanAvail;

    int rowCountAvail;

    try {

        myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ooadp?useSSL=false", "root", "root"); 

        Statement myStmt = myConn.createStatement();

        ResultSet myRs = myStmt.executeQuery("SELECT count(*) FROM bed WHERE bedStatus = 'Available' AND department = 'Pediatric'");

        while (myRs.next()) {

            rowBooleanAvail = myRs.last();

            rowCountAvail = myRs.getRow();

            ChangeBed cb = new ChangeBed(myRs.getInt(rowCountAvail), "");

            bedList.add(cb);

           }

        } catch (Exception e) {
            e.printStackTrace();
        }

    return bedList;

}

基本上我还有一个登录框架,登录后会打开我在上面代码中显示的框架。首先在显示警告消息的 Mousemoved 事件上显示 JOptionPane。单击 Ok/Cancel 后,它会关闭 JOptionPane 并停止 mousemoved 事件。

如果我有另一个登录框架,通过它我可以登录主页(上面显示的框架代码),将重复相同的过程,从而显示一个选项窗格。

所以现在我将打开 2 个主页并停用两个 mousemoved 事件,它不会再次触发。

对于第 2 帧,如果我在第一个主页框架中移动鼠标时达到显示 JOptionPane 的临界值 - 我该怎么做?

让我们回答一个问题:你为什么要停止活动?

意思是:你编写了一个对特定事件做出反应的监听器。现在你说:在某个时候;我不要 "reactions";那么如何防止这些事件进入我的侦听器?!

这是一种看待它的方式。

其他:简单地告诉您的听众他们应该忽略传入的事件,例如:

Class SomeExample {
  private boolean ignoreMouseMovedEvents = false;
  ...
  @Override
  public void mouseMoved(MouseEvent e) {
    if (ignoreMouseMovedEvents) {
      return; 
    }
    ... handle move events 

现在,只要您想忽略鼠标移动事件,您只需更新该布尔字段即可。

但这里要明确一点:我并不是说 忽略 事件总是最好的解决方案。我只是想表达一下:如果你很难阻止事件的发生"into your system";那么也许让他们来更容易;但是改变你的系统对它们的反应方式。

最后:还有一个稍微不同的变化:不是告诉你的听众忽略事件;您还可以从事件源取消注册 您的侦听器。换句话说:你可以简单地将你的听众从你附加它的框架中删除。当事件应该再次处理时,你重新添加它。