2009-10-25 1 views
0

У меня проблема в том, что ускорители JMenuItems больше не работают после отображения двух JDialogs непосредственно друг за другом.JMenuItem ускоритель не работает после показа двух немодальных JDialogs? (Только для Mac?)

Пожалуйста, обратите внимание на этот небольшой пример, который воспроизводит проблему:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class DialogBug 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new StartupRunnable(args.length == 0)); 
    } 

    public static class StartupRunnable 
     implements Runnable 
    { 
     private boolean both; 

     public StartupRunnable(boolean both) 
     { 
      this.both=both; 
     } 

     public void run() 
     { 
      MyFrame myFrame=new MyFrame(); 
      myFrame.setVisible(true); 
      myFrame.startUp(both); 
     } 
    } 

    public static class MyFrame 
     extends JFrame 
    { 
     private MyDialog dialog1; 
     private MyDialog dialog2; 

     public MyFrame() 
     { 
      super("MyFrame"); 
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      initUI(); 
     } 

     private void initUI() 
     { 
      dialog1=new MyDialog(this); 
      dialog2=new MyDialog(this); 
      JMenuBar menuBar=new JMenuBar(); 
      JMenu fileMenu=new JMenu("File"); 
      menuBar.add(fileMenu); 
      fileMenu.add(new JMenuItem(new OpenAction())); 
      setJMenuBar(menuBar); 
      setSize(200,200); 
     } 

     public void startUp(boolean both) 
     { 
      dialog1.setVisible(true); 
      if(both) 
      { 
       dialog2.setVisible(true); 
      } 
     } 

     private class OpenAction 
      extends AbstractAction 
     { 
      public OpenAction() 
      { 
       super("Open"); 
       KeyStroke accelerator = KeyStroke.getKeyStroke("ctrl O"); 
       putValue(Action.ACCELERATOR_KEY, accelerator); 
      } 

      public void actionPerformed(ActionEvent e) 
      { 
       System.out.println("Open executed"); 
      } 
     } 

    } 

    public static class MyDialog 
     extends JDialog 
    { 
     public MyDialog(JFrame parent) 
     { 
      super(parent); 
      setTitle("Dialog"); 
      setModal(false); 
      add(new JButton(new OkAction())); 
      pack(); 
     } 

     private class OkAction 
      extends AbstractAction 
     { 
      public OkAction() 
      { 
       super("Ok"); 
      } 

      public void actionPerformed(ActionEvent e) 
      { 
       setVisible(false); 
      } 
     } 
    } 
} 

Собирать с помощью javac DialogBug.java и выполнить его запуска java DialogBug.

Вы увидите два с кнопками «ОК». Отключите оба диалоговых окна, щелкнув их. Теперь нажмите «Ctrl-O». Это должно печатать «Open execute» на консоли, но этого не произойдет. Теперь щелкните меню «Файл». Теперь «Ctrl-O» будет работать так, как ожидалось.

Если вы запустите приложение с любым аргументом, например. java DialogBug x, тогда откроется только один диалог, и «Ctrl-O» будет работать сразу после отклонения диалога, как и ожидалось.

Моя среда является следующее:

java version "1.6.0_15" 
Java(TM) SE Runtime Environment (build 1.6.0_15-b03-219) 
Java HotSpot(TM) 64-Bit Server VM (build 14.1-b02-90, mixed mode) 

Но, насколько я знаю, это приложение ведет себя аналогично в других виртуальных машин.

Пожалуйста, помогите!
Я действительно не знаю, что может пойти не так. Если это ошибка Java (и я ожидаю, что она будет одной), то, пожалуйста, дайте мне знать, если у вас есть обходной путь ...

Если вы можете или не можете воспроизвести это на других системах, пожалуйста, скажите мне об этом в Комментарии.
Большое спасибо!

Update
После installing Java 1.5 on Snow Leopard (Вздох) Я могу подтвердить, что это происходит с 1.5.0_19, тоже, по крайней мере, на Snow Leopard.

Обновление 2
Работы для меня в Windows XP.

java version "1.6.0_13" 
Java(TM) SE Runtime Environment (build 1.6.0_13-b03) 
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing) 

java version "1.5.0_13" 
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05) 
Java HotSpot(TM) Client VM (build 1.5.0_13-b05, mixed mode) 

Update 3
Кажется, работает на Windows Vista тоже. Это делает этот выпуск Mac OS X 10.5 + 10.6, AFAIK.

Update 4
Эта ошибка рубриках Проблема ID # 7240026 на Apple.

+0

Прогресс на этом? Я сталкиваюсь с аналогичной проблемой. – Nemi

+0

Ничего еще ... Я задал вопрос о рассылке java-dev Apple и до сих пор не получил ответа. Мех. http://sourceforge.net/apps/trac/lilith/ticket/72 - это билет этой проблемы в моем приложении. Он имеет ссылку на немного улучшенную версию вышеприведенного примера кода. Пожалуйста, дайте мне знать, если вы найдете решение! Какова ваша конфигурация? – Huxi

+0

Оказывается, моя проблема не связана с ускорителями. Я использовал KeyboardFocusManager для отключения ввода с клавиатуры при выполнении долговременной задачи в SwingWorker, и это был тот код, который не срабатывал. Поскольку я реализовал их в одно и то же время, и я видел вашу аналогичную проблему, я думал, что ускорители виноваты, но это не так. Удачи – Nemi

ответ

1

Заменить метод actionPerformed класса OkAction в классе MyDialog со следующим:

public void actionPerformed(ActionEvent e) { 
      setVisible(false); 
      MyDialog.this.getParent().requestFocus(); 
     } 

По какой-то причине (возможно, потому, что диалоги не являются модальными), OS X не возвращает фокус на ваш MyFrame. Естественно, фокус возвращается в MyFrame, если вы закрываете диалоговые окна, закрывая их, но может быть что-то, просто скрывающее диалоги.

+0

Большое спасибо! Это работает! – Huxi

0

Работает отлично для меня на XP с использованием среды выполнения Java (TM) SE Runtime Environment (сборка 1.6.0_07-b06).

По какой-то причине мне кажется, что Ctrl + O является ускорителем для изменения ориентации компонентов. Просто интересно, происходит ли это со всеми ускорителями или только Ctrl + O?

Редактировать: возможно, вы забудете это предложение. Кажется, я не могу найти/вспомнить, где я, возможно, подумал об этом, и не могу проверить это в любой из моих тестовых программ.

+0

(Вы знаете, что вам нужно запускать JRE 1.6.0 с хотя бы обновлением 6u15 или 6u16, чтобы иметь все последние исправления безопасности?) –

+0

Я не занимаюсь с ним настоящей работой, я просто использую его для игры , – camickr

+0

«Ctrl-O» - это просто произвольный пример. Никакие ускорители не работают вообще. – Huxi

0

Я бежал без проблем на моем Mac, который имеет OS X 10.4 и версию Java «1.5.0_19».

Мне интересно, если после закрытия двух модальных диалогов основной фрейм имеет фокус. Я не использовал ускорители в течение длительного времени, но я думаю, что, возможно, произошли некоторые недавние изменения в отношении ускорителей, зарегистрированных в строке меню, и ускорители, зарегистрированные в кадре (например, ярлыки).

Удачи вам.

+0

Спасибо. Это становится странным и странным. Это неправильно, как описано на Leopard. Я считаю, что он показывает ту же самую неисправность в Windows Vista, но я жду подтверждения ... – Huxi

+0

Нет, похоже, это работает и с Vista. – Huxi

0

Я пробовал на Leopard/10.5 и программа не работает либо:

Java 5 (Apple JVM)

java version "1.5.0_20" 
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_20-b02-315) 
Java HotSpot(TM) Client VM (build 1.5.0_20-141, mixed mode, sharing) 

Java 6 (SoyLatte/Open JDK BSD Port)

java version "1.6.0_03-p3" 
Java(TM) SE Runtime Environment (build 1.6.0_03-p3-landonf_19_aug_2008_14_55-b00) 
Java HotSpot(TM) Server VM (build 1.6.0_03-p3-landonf_19_aug_2008_14_55-b00, mixed mode) 
Смежные вопросы