java swing limpa a fila de eventos
É possível fazer isso de maneira padrão?
qui está o cenári
omece a fazer algo caro no EDT (o EDT é bloqueado até que a operação cara termine
nquanto o EDT foi bloqueado, o usuário continuou clicando / arrastando os botões do mouse. Todas as ações do mouse são registradas em algum luga
uando o EDT é gratuito (feito com as coisas caras), ele começa a processar os eventos do mous
O que eu quero na etapa 3 é descartar os eventos de mouse empilhados. Depois que o EDT estiver livre, qualquer novo evento de mouse deve ser tratado da maneira usua
Alguma idéia de como conseguir iss
PS: Não é possível impedir que o EDT seja bloqueado (não controle o comportamento de alguns dos módulos do meu programa
EDIT: Se eu puder chamar com segurança "SunToolkit.flushPendingEvents ()", sempre posso colocar uma vidraça antes de iniciar a operação dispendiosa no EDT. Depois que a operação cara terminar, no encadeamento EDT, limpe todos os eventos - eles irão para um painel de vidro que não fará nada. E então deixe o EDT funcionar normalmente.
EDIT2: adicionei um SSCCE para demonstrar o problem
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; }
Execute o SSCCE
Clique no botão "Aguarde 3 segundos". Simula uma operação cara. O cursor do mouse mudará para ocupado.
Enquanto o cursor estiver ocupado, clique no botão de alternância "Clique em mim". Se depois de três segundos, o botão de alternância mudar de estado, o evento do mouse será recebido pelo botão de alternância e não ficará pres
Quero que enquanto o cursor estiver ocupado, os eventos do mouse gerados (e outros) sejam descartado
Obrigado