java queue 清空_java swing清除事件队列

可以以标准方式执行此操作吗?

这是场景。

开始在EDT中执行一些昂贵的操作(EDT被阻止,直到昂贵的操作结束为止)。

在阻止EDT的同时,用户继续单击/拖动鼠标按钮。所有鼠标动作都记录在某处。

当EDT免费时(用昂贵的东西完成),它开始处理鼠标事件。

我在步骤3中想要的是丢弃堆积的鼠标事件。EDT释放后,任何新的鼠标事件都应按常规方式处理。

关于如何实现这一目标的任何想法。

PS:对于我来说,不可能阻止EDT的阻塞(我无法控制程序中某些模块的行为)。

编辑:如果我可以安全地调用“

SunToolkit.flushPendingEvents()”,那么在EDT中开始昂贵的操作之前,我总是可以放一块玻璃。在昂贵的操作结束之后,然后在EDT线程上冲洗所有事件-

它们将进入不会做任何事情的玻璃窗格。然后让EDT正常工作。

EDIT2:我添加了一个SSCCE来演示此问题。

公共类BusyCursorTest2扩展了javax.swing.JFrame {

公共BusyCursorTest2(){

javax.swing.JButton wait =新的javax.swing.JButton(“等待3秒”);

getContentPane()。setLayout(new java.awt.GridLayout(2,1,0,0));

getContentPane()。add(wait);

getContentPane()。add(new javax.swing.JToggleButton(“ Click me”)));

setTitle(“ Busy Cursor”);

setSize(300,200);

setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);

setVisible(true);

wait.addActionListener(new java.awt.event.ActionListener(){

公共无效actionPerformed(java.awt.event.ActionEvent事件){

最终的java.util.Timer timer = switchToBusyCursor(BusyCursorTest2.this);

尝试{

//在EDT中做一些昂贵的事情

尝试{

Thread.sleep(3000);

} catch(InterruptedException e){

//没做什么

}

}最后{

switchToNormalCursor(BusyCursorTest2.this,timer);

}

}

});

}

公共静态java.util.Timer switchToBusyCursor(final javax.swing.JFrame frame){

startEventTrap(frame);

java.util.TimerTask timerTask = new java.util.TimerTask(){

公共无效run(){

startWaitCursor(frame);

}

};

最终的java.util.Timer计时器=新的java.util.Timer();

timer.schedule(timerTask,DELAY_MS);

返回计时器;

}

public static void switchToNormalCursor(final javax.swing.JFrame frame,final java.util.Timer timer){

timer.cancel();

stopWaitCursor(frame);

stopEventTrap(frame);

}

私有静态无效startWaitCursor(javax.swing.JFrame frame){

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){

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){

frame.getGlassPane()。addMouseListener(mouseAdapter);

frame.getGlassPane()。setVisible(true);

}

私有静态无效stopEventTrap(javax.swing.JFrame frame){

frame.getGlassPane()。removeMouseListener(mouseAdapter);

frame.getGlassPane()。setVisible(false);

}

私有静态最终java.awt.event.MouseAdapter mouseAdapter = new java.awt.event.MouseAdapter(){

};

公共静态void main(String [] args){

javax.swing.SwingUtilities.invokeLater(new Runnable(){

公共无效run(){

新的BusyCursorTest2();

}

});

}

私有静态最终int DELAY_MS = 250;

}

运行SSCCE

单击按钮“等待3秒”。它模拟了昂贵的操作。鼠标光标将变为忙。

当光标忙时,单击切换按钮“单击我”。如果三秒钟后,切换按钮更改了其状态,则说明该切换按钮收到了鼠标事件,但未捕获鼠标事件。

我希望在光标看起来很忙的同时,丢弃生成的鼠标(和其他)事件。

谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值