代码之家  ›  专栏  ›  技术社区  ›  Huxi

显示两个非模态JDialogs后,jmenuItem加速器不工作?(只有MAC?)

  •  0
  • Huxi  · 技术社区  · 15 年前

    我有一个问题,在一个接一个地显示两个JDialogs之后,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”。这应该将“open executed”打印到控制台,但不会发生这种情况。 现在单击“文件”菜单。现在“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错误(我希望它是一个),那么请让我知道,如果你有一个解决办法…

    如果你能或不能在其他系统上复制,请在评论中告诉我。
    谢谢!

    更新
    之后 installing Java 1.5 on Snow Leopard ( 叹息 )我可以肯定,这种情况也发生在1.5.0英寸的雪豹身上。

    更新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的问题,目前为止。

    更新4
    这个bug在苹果的problem id_7240026下归档。

    4 回复  |  直到 15 年前
        1
  •  1
  •   GalaJon    15 年前

    将MyDialog类中Okaction类的actionExecuted方法替换为以下内容:

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

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

        2
  •  0
  •   camickr    15 年前

    在XP上使用Java(TM)SE运行时环境(Buff1.1.0Y07B06)对我很好。

    出于某种原因,我似乎认为ctrl+o是更改组件方向的加速器。只是想知道这是在所有加速器中发生还是只在ctrl+o中发生?

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

        3
  •  0
  •   nozebacle    15 年前

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

    我想知道,在关闭两个模式对话框后,主框架是否有焦点。 我有很长一段时间没有使用加速器了,但我认为最近可能对菜单栏中注册的加速器和框架中注册的加速器(如快捷键)进行了一些更改。

    祝你好运。

        4
  •  0
  •   Rob Smith    15 年前

    我在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(大豆/开放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)