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

questionAnswers(3)

yourAnswerToTheQuestion