удаление событий мыши / элементов управления из компонентов свинга со стеклом - PullRequest
1 голос
/ 17 февраля 2010

У меня есть клиент-серверное приложение, и я использую Swing на стороне клиента. Мой свинг-клиент имеет одно главное окно (jframe) и множество панелей, панелей инструментов и меню. Я хочу удалить все клиентские действия / события мыши (или просто захватить и ничего не делать), пока клиент ожидает ответа от сервера с помощью glasssPane. Вот код, который я написал:

private final static MouseAdapter mouseAdapter = new MouseAdapter() 
{
  public void mouseClicked(MouseEvent e) 
  {
   System.out.println("MouseClicked..!");
  }
 };

private static Cursor WAIT_CURSOR = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);
private static Cursor DEFAULT_CURSOR = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);

и

public static void startWaitCursor(JComponent comp)
{
  MainWindow root = ((MainWindow) comp.getTopLevelAncestor());

  root.getGlassPane().setCursor(WAIT_CURSOR);
  root.getGlassPane().addMouseListener(mouseAdapter);
  root.getGlassPane().setVisible(true);
}

public static void stopWaitCursor(JComponent comp)
{    
  MainWindow root = ((MainWindow) comp.getTopLevelAncestor()); 

  root.getGlassPane().setCursor(DEFAULT_CURSOR);
  root.getGlassPane().setVisible(false);
}

но я не могу управлять событиями захвата мыши. Изменение курсоров на glassPane работает нормально, но я не могу добавить mouseAdapter или не могу сделать glasssPane компонентом верхнего уровня.

Есть идеи?

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

Пару дней после копания свинг-потоков я наконец нашел реальный ответ: SwingWorker

Теперь мой окончательный код похож на

startWaitCursor();
SwingWorker worker = new SwingWorker() {
   public Object doInBackground() 
   {
      doWork(); // time consuming server request
      return null;
   }
   public void done() 
   {
      stopWaitCursor();
   }
};
worker.execute();

В методе startWaitCursor () я устанавливаю видимую стеклянную панель (с альфа-фоном), отображаю сообщение, предупреждающее о том, что выполняется трудоемкая работа пользователя, устанавливаю курсор на wait_cursor (песочные часы) и использую все события клавиатуры и мыши. Вот и все.

И с помощью SwingWorker мой клиент на самом деле отзывчив (он работает так, как будто не выполняется запрос к серверу), но, поскольку я отображаю стеклянную панель и использую все события, связанные с мышью и мышью, он выглядит как неотзывчивый.

Какое облегчение .. Качели качели ...

веселит ..

1 голос
/ 18 февраля 2010

Я понял, что мой код работает, но моя проблема связана с потоками.Мой код был что-то вроде:

startWaitCursor(); 
work(); // server request that takes time 
stopWaitCursor();

и изменил его на:

startWaitCursor(); 
SwingUtilities.invokeLater(new Runnable() {
poblic void run() { 
try 
{ 
work(); // server request 
} 
finally 
{ 
stopWaitCursor(); 
}

, делая эту модификацию, я мог видеть настройки, которые я сделал в методе startWaitCursor (), пока клиент ожидаетответ от сервера.

Но все же есть небольшая проблема.В методе startWaitCursor () я отключил события клавиш, мыши и фокуса для стеклянной панели, но события по-прежнему записываются основным кадром, даже если отображается glassPane.

addMouseListener(new MouseAdapter() {});
addMouseMotionListener(new MouseMotionAdapter() {});
addKeyListener(this);
setFocusTraversalKeysEnabled(false);

После того, как ответ сервера достигнут клиенту и вызван метод stopWaitCursor (), события обрабатываются в главном фрейме.

Если я отключаю основной фрейм моего приложения, пока клиент ожидает, чемкурсор не изменяется на wait_cursor, если я не отключаю основной кадр, курсор изменяется, но события ставятся в очередь.

cheers ...

...