我遇到問題,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運行時環境
有沒有這方面的進展?我遇到了類似的問題。 – Nemi 2009-11-05 14:43:24
什麼都沒有......我問了關於java-dev Apple郵件列表的問題,至今沒有收到任何回覆。咩。 http://sourceforge.net/apps/trac/lilith/ticket/72是這個問題在我的應用程序的票。它有一個指向上述示例代碼的稍微增強版本的鏈接。請讓我知道,如果你找到解決方案!你的配置是什麼? – Huxi 2009-11-05 19:29:42
原來我的問題與加速器無關。在SwingWorker中執行長時間運行的任務時,我正在使用KeyboardFocusManager來禁用鍵盤輸入,並且這是失敗的代碼。既然我在同一時間實施它們,而且我看到了類似的問題,我認爲加速器應該受到指責,但事實並非如此。祝你好運 – Nemi 2009-11-05 20:30:23