2009-10-25 39 views
0

我遇到問題,JMenuItems的加速器在兩個JDialog直接顯示後不再起作用。JMenuItem加速器在顯示兩個非模態JDialog後無法工作? (僅限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

你會看到兩個用 「OK」 -Buttons。關閉這兩個對話框點擊它們。 現在按「Ctrl-O」。這應該打印「打開已執行」到控制檯,但這不會發生。 現在點擊「文件」菜單。現在「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的bug(我希望它是一個),那麼請讓我知道,如果你有一個解決辦法...

如果你可以或不可以複製本上的其他系統,請告訴我,所以在註釋。
非常感謝!

更新
installing Java 1.5 on Snow Leopard嘆息)我可以證實,這種情況與1.5.0_19,也至少在雪豹。

更新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) 

更新3
似乎在Windows Vista上工作了。這使得這個Mac OS X 10.5 + 10.6的問題AFAIK到目前爲止。

更新4
此錯誤是在蘋果下的問題編號7240026備案。使用Java(TM)SE運行時環境

+0

有沒有這方面的進展?我遇到了類似的問題。 – Nemi 2009-11-05 14:43:24

+0

什麼都沒有......我問了關於java-dev Apple郵件列表的問題,至今沒有收到任何回覆。咩。 http://sourceforge.net/apps/trac/lilith/ticket/72是這個問題在我的應用程序的票。它有一個指向上述示例代碼的稍微增強版本的鏈接。請讓我知道,如果你找到解決方案!你的配置是什麼? – Huxi 2009-11-05 19:29:42

+0

原來我的問題與加速器無關。在SwingWorker中執行長時間運行的任務時,我正在使用KeyboardFocusManager來禁用鍵盤輸入,並且這是失敗的代碼。既然我在同一時間實施它們,而且我看到了類似的問題,我認爲加速器應該受到指責,但事實並非如此。祝你好運 – Nemi 2009-11-05 20:30:23

回答

1

改爲如下所述OkAction類的actionPerformed方法在MyDialog類:

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

出於某種原因(可能是因爲對話框不是模態),OS X沒有將焦點返回給MyFrame。焦點自然返回到MyFrame,如果通過關閉它們來關閉對話框,但可能只是簡單地隱藏對話框。

+0

非常感謝!這工作! – Huxi 2009-12-31 08:25:03

0

工作正常,我在XP(建立1.6.0_07-B06)。

出於某種原因,我似乎認爲,按Ctrl + O是改變組件的方向加速器。只是想知道這是否發生在所有加速器上或只有Ctrl + O?

編輯:你可能忘了這個建議。我似乎無法找到/回想我可能會想到的這種情況,而且無法在我的任何測試程序中驗證這一點。

+0

(你知道你需要運行JRE 1.6.0,至少需要更新6u15或6u16才能擁有所有最新的安全補丁?) – 2009-10-26 00:37:45

+0

我沒有做任何真正的工作,我只是用它來玩。 – camickr 2009-10-26 00:44:55

+0

「Ctrl-O」只是一個任意的例子。沒有加速器在工作。 – Huxi 2009-10-26 12:23:30

0

我在OS X 10.4和Java版本「1.5.0_19」的Mac上沒有問題地運行它。

我想知道如果關閉兩個模式對話框後主框架有焦點。 我很久沒有使用過加速器了,但我認爲最近有一些關於在菜單欄中註冊的加速器和在框架中註冊的加速器(如快捷鍵)的更改。

祝你好運。

+0

謝謝。這越來越陌生和陌生。它也像Leopard上描述的那樣行事不端。我相信它在Windows Vista上顯示了同樣的故障,但我在等待確認... – Huxi 2009-10-26 12:42:12

+0

不,它似乎也適用於Vista。 – Huxi 2009-11-05 19:31:44

0

我試過在Leopard/10.5和程序不工作之一:

Java 5的(蘋果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 /打開JDK BSD端口)

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)