0

我的问题是,在一个接一个地直接显示两个 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 下提交。

4

4 回答 4

1

将 MyDialog 类中 OkAction 类的 actionPerformed 方法替换为以下内容:

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

出于某种原因(可能是因为对话框不是模态的),OS X 没有将焦点返回到您的 MyFrame。如果您通过关闭对话框来解除对话框,焦点自然会返回到 MyFrame,但可能只是简单地隐藏对话框。

于 2009-12-30T16:37:13.190 回答
0

在 XP 上使用 Java(TM) SE 运行时环境(构建 1.6.0_07-b06)对我来说效果很好。

出于某种原因,我似乎认为 Ctrl+O 是更改组件方向的加速器。只是想知道这是否发生在所有加速器或仅 Ctrl+O 上?

编辑:你可能会忘记这个建议。我似乎无法找到/回忆我可能想到的地方,也无法在我的任何测试程序中验证这一点。

于 2009-10-26T00:23:47.890 回答
0

我在具有 OS X 10.4 和 Java 版本“1.5.0_19”的 Mac 上运行它没有问题。

我想知道在您关闭两个模式对话框后,主框架是否具有焦点。我已经很久没有使用加速器了,但我认为最近可能在菜单栏中注册的加速器和在框架中注册的加速器(如快捷方式)发生了一些变化。

祝你好运。

于 2009-10-26T06:40:29.180 回答
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)
于 2009-11-05T22:35:52.950 回答