我的问题是,在一个接一个地直接显示两个 JDialog 之后,JMenuItems 的加速器不再工作。
请看一下重现问题的这个小例子:
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”。这应该将“打开执行”打印到控制台,但这不会发生。现在单击“文件”菜单。现在“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 错误(我希望它是一个),那么如果您有解决方法,请告诉我...
如果您可以或不能在其他系统上重现此内容,请在评论中告诉我。
非常感谢!
更新
在Snow Leopard 上安装 Java 1.5(叹气)后,我可以确认 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)
更新 3
似乎也适用于 Windows Vista。这使得这是一个 Mac OS X 10.5+10.6 问题,AFAIK 到目前为止。
更新 4
此错误在 Apple 的问题 ID #7240026 下提交。