Можно ли это сделать стандартным образом?
Вот сценарий.
Начните делать что-нибудь дорогое в 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 секунды». Имитирует дорогостоящую операцию. Курсор мыши изменится на "занято".
Пока курсор занят, нажмите кнопку-переключатель «Нажми меня». Если через три секунды кнопка переключения меняет свое состояние, значит событие мыши было получено кнопкой переключения и не было захвачено.
Я хочу, чтобы, пока курсор выглядит занятым, сгенерированные события мыши (и другие) отбрасывались.
Спасибо.
EventQueue theQueue = getToolkit().getSystemEventQueue();
не поймите, что если вы отправите какие-либо события в EDT вручную, все ожидающие потоки будут потеряны и останутся навсегда в существующей форме , просто не делай этого, - person mKorbel   schedule 17.08.2011