是否可以以标准方式执行此操作?
这是场景。
开始在 EDT 中做一些昂贵的事情(EDT 被阻塞,直到昂贵的操作结束)。
当 EDT 被阻止时,用户继续单击/拖动鼠标按钮。所有鼠标动作都记录在某处。
当 EDT 空闲时(用昂贵的东西完成),它开始处理鼠标事件。
我在步骤 3 中想要的是丢弃堆积的鼠标事件。在 EDT 空闲后,任何新的鼠标事件都应该以通常的方式处理。
关于如何实现这一目标的任何想法。
PS:我无法阻止 EDT 被阻塞(我无法控制程序中某些模块的行为)。
编辑:如果我可以安全地调用“SunToolkit.flushPendingEvents()”,那么我总是可以在 EDT 中开始昂贵的操作之前放置一个玻璃窗格。在 EDT 线程上的昂贵操作结束后,刷新所有事件 - 它们将进入一个不会做任何事情的玻璃窗格。然后让 EDT 正常工作。
EDIT2:我添加了一个 SSCCE 来演示这个问题。
公共类 BusyCursorTest2 扩展 javax.swing.JFrame {
公共 BusyCursorTest2() {
javax.swing.JButton wait = new javax.swing.JButton("等待 3 秒");
getContentPane().setLayout(new java.awt.GridLayout(2, 1, 0, 0));
getContentPane().add(等待);
getContentPane().add(new javax.swing.JToggleButton("点击我"));
setTitle("忙碌光标");
设置大小(300、200);
setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
设置可见(真);
wait.addActionListener(new java.awt.event.ActionListener() {
公共无效actionPerformed(java.awt.event.ActionEvent事件){
final java.util.Timer timer = switchToBusyCursor(BusyCursorTest2.this);
尝试 {
//在 EDT 中做一些昂贵的事情
尝试 {
线程.sleep(3000);
} 捕捉(InterruptedException e){
//没做什么
}
} 最后 {
switchToNormalCursor(BusyCursorTest2.this, timer);
}
}
});
}
公共静态 java.util.Timer switchToBusyCursor(final javax.swing.JFrame frame) {
开始事件陷阱(帧);
java.util.TimerTask timerTask = new java.util.TimerTask() {
公共无效运行(){
startWaitCursor(帧);
}
};
final java.util.Timer timer = new java.util.Timer();
timer.schedule(timerTask, DELAY_MS);
返回计时器;
}
public static void switchToNormalCursor(final javax.swing.JFrame frame, final java.util.Timer timer) {
计时器.取消();
停止等待光标(帧);
停止事件陷阱(帧);
}
私有静态无效 startWaitCursor(javax.swing.JFrame 框架) {
frame.getGlassPane().setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR));
frame.getGlassPane().addMouseListener(mouseAdapter);
frame.getGlassPane().setVisible(true);
}
私有静态无效 stopWaitCursor(javax.swing.JFrame 框架) {
frame.getGlassPane().setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR));
frame.getGlassPane().removeMouseListener(mouseAdapter);
frame.getGlassPane().setVisible(false);
}
私有静态无效 startEventTrap(javax.swing.JFrame 框架){
frame.getGlassPane().addMouseListener(mouseAdapter);
frame.getGlassPane().setVisible(true);
}
私有静态无效stopEventTrap(javax.swing.JFrame框架){
frame.getGlassPane().removeMouseListener(mouseAdapter);
frame.getGlassPane().setVisible(false);
}
私有静态最终 java.awt.event.MouseAdapter mouseAdapter = new java.awt.event.MouseAdapter() {
};
公共静态无效主要(字符串[]参数){
javax.swing.SwingUtilities.invokeLater(new Runnable() {
公共无效运行(){
新的 BusyCursorTest2();
}
});
}
私有静态最终 int DELAY_MS = 250;
}
运行 SSCCE
单击“等待 3 秒”按钮。它模拟了昂贵的操作。鼠标光标将变为忙。
当光标忙时,单击切换按钮“单击我”。如果在三秒后,切换按钮改变了它的状态,那么鼠标事件被切换按钮接收并且没有被捕获。
我希望当光标看起来很忙时,丢弃生成的鼠标(和其他)事件。
谢谢。