在 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";那么也许让他们来更容易;但是改变你的系统对它们的反应方式。
最后:还有一个稍微不同的变化:不是告诉你的听众忽略事件;您还可以从事件源取消注册 您的侦听器。换句话说:你可以简单地将你的听众从你附加它的框架中删除。当事件应该再次处理时,你重新添加它。
我在学校做一个项目,我有一个特殊的功能要实现,但有一些问题。我需要做的是检查 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";那么也许让他们来更容易;但是改变你的系统对它们的反应方式。
最后:还有一个稍微不同的变化:不是告诉你的听众忽略事件;您还可以从事件源取消注册 您的侦听器。换句话说:你可以简单地将你的听众从你附加它的框架中删除。当事件应该再次处理时,你重新添加它。