java swing 删除事件_java swing清除事件队列

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

这是场景.

>开始在EDT中做一些昂贵的事情(EDT被阻止,直到昂贵的操作结束).

>当EDT被阻止时,用户继续单击/拖动鼠标按钮.所有鼠标操作都记录在某处.

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

我在步骤3中想要的是丢弃堆积的鼠标事件.在EDT免费之后,任何新的鼠标事件都应该以通常的方式处理.

关于如何实现这一点的任何想法.

PS:我不可能阻止EDT被阻止(我不控制程序中某些模块的行为).

编辑:

如果我可以安全地调用“SunToolkit.flushPendingEvents()”,那么在开始EDT中昂贵的操作之前,我总是可以放一个玻璃板.在昂贵的操作结束后,在EDT线程上,冲洗所有事件 – 他们将进入一个不做任何事情的玻璃窗格.然后让EDT正常工作.

EDIT2:

我添加了一个SSCCE来演示这个问题.

public class BusyCursorTest2 extends javax.swing.JFrame {

public BusyCursorTest2() {

javax.swing.JButton wait = new javax.swing.JButton("Wait 3 seconds");

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

public void actionPerformed(java.awt.event.ActionEvent event) {

final java.util.Timer timer = switchToBusyCursor(BusyCursorTest2.this);

try {

//do something expensive in EDT

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

//do nothing

}

} finally {

switchToNormalCursor(BusyCursorTest2.this, timer);

}

}

});

}

public static java.util.Timer switchToBusyCursor(final javax.swing.JFrame frame) {

startEventTrap(frame);

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

public void run() {

startWaitCursor(frame);

}

};

final java.util.Timer timer = new java.util.Timer();

timer.schedule(timerTask, DELAY_MS);

return timer;

}

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

timer.cancel();

stopWaitCursor(frame);

stopEventTrap(frame);

}

private static void 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);

}

private static void 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);

}

private static void startEventTrap(javax.swing.JFrame frame) {

frame.getGlassPane().addMouseListener(mouseAdapter);

frame.getGlassPane().setVisible(true);

}

private static void stopEventTrap(javax.swing.JFrame frame) {

frame.getGlassPane().removeMouseListener(mouseAdapter);

frame.getGlassPane().setVisible(false);

}

private static final java.awt.event.MouseAdapter mouseAdapter = new java.awt.event.MouseAdapter() {

};

public static void main(String[] args) {

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

public void run() {

new BusyCursorTest2();

}

});

}

private static final int DELAY_MS = 250;

}

>运行SSCCE

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

>当光标处于忙碌状态时,单击切换按钮“单击我”.如果在三秒钟后,切换按钮改变其状态,则切换按钮接收到鼠标事件并且没有被捕获.

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

谢谢.

解决方法:

好的,我终于把一切都搞定了.我正在发布SSCCE以获得正确的工作示例.诀窍是使用“javax.swing.SwingUtilities.invokeLater()”方法隐藏glasspane.在Runnable中包装必要的代码,然后使用invokeLater调用它.在这种情况下,Swing处理所有鼠标事件(因为玻璃板拦截它们没有任何反应),然后隐藏玻璃板.这是SSCCE.

public class BusyCursorTest2 extends javax.swing.JFrame {

public BusyCursorTest2() {

javax.swing.JButton wait = new javax.swing.JButton("Wait 3 seconds");

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

public void actionPerformed(java.awt.event.ActionEvent event) {

final java.util.Timer timer = switchToBusyCursor(BusyCursorTest2.this);

try {

//do something expensive in EDT or otherwise

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

//do nothing

}

} finally {

switchToNormalCursorEventThread(BusyCursorTest2.this, timer);

}

}

});

}

public static java.util.Timer switchToBusyCursor(final javax.swing.JFrame frame) {

startEventTrap(frame);

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

public void run() {

startWaitCursor(frame);

}

};

final java.util.Timer timer = new java.util.Timer();

timer.schedule(timerTask, DELAY_MS);

return timer;

}

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

Runnable r = new Runnable() {

public void run() {

switchToNormalCursor(frame, timer);

}

};

javax.swing.SwingUtilities.invokeLater(r);

}

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

timer.cancel();

stopWaitCursor(frame);

stopEventTrap(frame);

}

private static void 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);

}

private static void 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);

}

private static void startEventTrap(javax.swing.JFrame frame) {

frame.getGlassPane().addMouseListener(mouseAdapter);

frame.getGlassPane().setVisible(true);

}

private static void stopEventTrap(javax.swing.JFrame frame) {

java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue();

frame.getGlassPane().removeMouseListener(mouseAdapter);

frame.getGlassPane().setVisible(false);

}

private static final java.awt.event.MouseAdapter mouseAdapter = new java.awt.event.MouseAdapter() {

};

public static void main(String[] args) {

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

public void run() {

new BusyCursorTest2();

}

});

}

private static final int DELAY_MS = 250;

}

同样,EDT如果可能的话必须不被阻止.但是,如果必须,您可以使用上面的工作忙碌光标.

欢迎任何评论.

标签:java,swing,event-dispatch-thread,eventqueue

来源: https://codeday.me/bug/20190518/1127435.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值