我正在学校做一个项目,我有一个区别特征要实现,但有一些问题。我需要做的是,我要检查我的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;
}
}
}
});
控制器类代码
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的临界值 - 我该怎么做?
答案 0 :(得分:1)
让我们回答你的问题:你为什么要停止这些事件?
含义:您编写了一个对某些事件做出反应的监听器。现在你说:在某些时候;我不想要“反应”;那么如何防止这些事件进入我的听众?!
这是观察它的一种方式。
另一个:简单地告诉你的听众他们应该忽略传入的事件,例如:
Class SomeExample {
private boolean ignoreMouseMovedEvents = false;
...
@Override
public void mouseMoved(MouseEvent e) {
if (ignoreMouseMovedEvents) {
return;
}
... handle move events
现在,您只需要在忽略鼠标移动事件时更新该布尔字段。
但请谨说:我并不是说忽略事件始终是最佳解决方案。我只是在表达:如果你很难阻止事件进入你的系统“;那么也许让他们来更容易;但要改变你的系统对它们的反应方式。
最后:还有一个略有不同的变体:而不是告诉你的听众忽略事件;您还可以从事件源取消注册您的听众。换句话说:你可以简单地从你附加的框架中删除你的监听器。当你再次处理事件时,你重新添加它。