java swing清除事件队列

java swing清除事件队列,第1张

java swing清除事件队列

好的,我终于可以正常工作了。我正在发布SSCCE以获取正确的示例。诀窍是使用“
javax.swing.SwingUtilities.invokeLater()”方法隐藏玻璃窗格。将必要的代码包装在Runnable中,然后使用invokeLater对其进行调用。在这种情况下,Swing处理所有鼠标事件(由于玻璃窗格拦截了鼠标事件,因此没有任何反应),然后隐藏了玻璃窗格。这是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){  //没做什么         }     }最后{         switchToNormalCursorEventThread(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 switchToNormalCursorEventThread(final javax.swing.Jframe frame,final java.util.Timer timer){        Runnable r = new Runnable(){ 公共无效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);    }    私有静态无效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){        java.awt.Toolkit.getDefaultToolkit()。getSystemEventQueue();        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;}

同样,绝不能阻止EDT。但是,如果必须的话,您可以像上面那样使用忙碌的游标。

欢迎任何意见。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5135511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存