好的,我终于可以正常工作了。我正在发布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。但是,如果必须的话,您可以像上面那样使用忙碌的游标。
欢迎任何意见。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)