在Java中停止MouseMoved事件

时间:2016-08-01 14:58:18

标签: java swing mouseevent mouselistener mousemove

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

我正在尝试做的是另一种情况更加艰难,2帧被打开。例如,第一帧用户使用床,它将下降到临界值10,当用户移动鼠标箭头时,另一帧将弹出JOptionPane,显示消息。

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

我对这个行动事件不熟悉。我正在用MySQL数据库进行3层编程。

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

Stopping mouseMoved

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

            }   

        }
    });

控制器类代码

public ArrayList<ChangeBed> processCountBedsAvailableDpt4() {

    ChangeBed changeBed = new ChangeBed();

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

    bedList = changeBed.countBedsAvailableDpt4();

    return bedList;

}

从SQL DB检索的实体类

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,显示警告消息。单击“确定/取消”后,它将关闭JOptionPane并停止mousemoved事件。

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

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

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

1 个答案:

答案 0 :(得分:1)

让我们回答你的问题:你为什么要停止这些事件?

含义:您编写了一个对某些事件做出反应的监听器。现在你说:在某些时候;我不想要“反应”;那么如何防止这些事件进入我的听众?!

这是观察它的一种方式。

另一个:简单地告诉你的听众他们应该忽略传入的事件,例如:

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

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

但请谨说:我并不是说忽略事件始终是最佳解决方案。我只是在表达:如果你很难阻止事件进入你的系统“;那么也许让他们来更容易;但要改变你的系统对它们的反应方式。

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