首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JMenuItem加速器显示两个非模态JDialogs后不工作?(仅限Mac?)

JMenuItem加速器显示两个非模态JDialogs后不工作?(仅限Mac?)
EN

Stack Overflow用户
提问于 2009-10-25 23:00:53
回答 4查看 1.6K关注 0票数 0

我的问题是,JMenuItems的加速器在直接显示两个JDialogs之后就不再工作了。

请看这个再现问题的小例子:

代码语言:javascript
复制
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”键。这应该打印“”到控制台,但这不会发生。现在点击“文件”菜单。现在“Ctrl”将像预期的那样工作。

如果您使用任何参数启动应用程序,例如java DialogBug x,那么只会打开一个对话框,“Ctrl”将在终止对话框后立即工作,就像预期的那样。

我的环境如下:

代码语言:javascript
复制
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)

但据我所知,这个应用程序在其他VM中的行为类似。

请帮帮我!

我真的不知道这里会出什么问题。如果这是一个Java错误(我希望它是一个),那么请告诉我,如果您有解决办法.

如果您可以或不能在其他系统上复制这一点,请在评论中告诉我。

非常感谢!

更新

在雪豹上安装Java1.5 (叹息)之后,我可以确认1.5.0_19也会发生这种情况,至少在雪豹身上是这样的。

更新2

在Windows上为我工作。

代码语言:javascript
复制
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。这使得到目前为止,这是Mac 10.5+10.6的一个问题。

更新4

这个bug是在苹果的问题ID #7240026下注册的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-30 16:37:13

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

代码语言:javascript
复制
public void actionPerformed(ActionEvent e) {
            setVisible(false);
            MyDialog.this.getParent().requestFocus();
        }

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

票数 1
EN

Stack Overflow用户

发布于 2009-10-26 00:23:47

使用Java(TM) SE运行时环境(Build1.6.0_07-B06)在XP上工作很好。

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

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

票数 0
EN

Stack Overflow用户

发布于 2009-10-26 06:40:29

我在拥有OSX10.4和Java版本"1.5.0_19“的mac上运行它,没有问题。

我想知道在你关闭两个模态对话框后,主框架是否有焦点。我已经很长一段时间没有使用加速器了,但我认为,也许最近在菜单栏中注册的加速器和在框架中注册的加速器(比如快捷方式)有了一些变化。

祝你好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1622386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档