我的问题是,JMenuItems的加速器在直接显示两个JDialogs之后就不再工作了。
请看这个再现问题的小例子:
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”将在终止对话框后立即工作,就像预期的那样。
我的环境如下:
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上为我工作。
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下注册的。
发布于 2009-12-30 16:37:13
将actionPerformed类中的OkAction类的MyDialog方法替换为以下内容:
public void actionPerformed(ActionEvent e) {
setVisible(false);
MyDialog.this.getParent().requestFocus();
}由于某些原因(可能是因为对话框不是模态的),OS没有将焦点返回到您的MyFrame。如果通过关闭对话框来排除对话框,焦点自然会返回到MyFrame,但可能只是隐藏对话框。
发布于 2009-10-26 00:23:47
使用Java(TM) SE运行时环境(Build1.6.0_07-B06)在XP上工作很好。
出于某种原因,我似乎认为Ctrl+O是改变组件方向的加速器。只是想知道这是发生在所有加速器还是只有Ctrl+O?
编辑:你可能会忘记这个建议。我似乎无法找到/回忆我在哪里想过这一点,也无法在我的任何测试程序中验证这一点。
发布于 2009-10-26 06:40:29
我在拥有OSX10.4和Java版本"1.5.0_19“的mac上运行它,没有问题。
我想知道在你关闭两个模态对话框后,主框架是否有焦点。我已经很长一段时间没有使用加速器了,但我认为,也许最近在菜单栏中注册的加速器和在框架中注册的加速器(比如快捷方式)有了一些变化。
祝你好运。
https://stackoverflow.com/questions/1622386
复制相似问题