У меня проблема в том, что ускорители JMenuItems больше не работают после отображения двух JDialogs непосредственно друг за другом.JMenuItem ускоритель не работает после показа двух немодальных JDialogs? (Только для Mac?)
Пожалуйста, обратите внимание на этот небольшой пример, который воспроизводит проблему:
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 execute» на консоли, но этого не произойдет. Теперь щелкните меню «Файл». Теперь «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 (и я ожидаю, что она будет одной), то, пожалуйста, дайте мне знать, если у вас есть обходной путь ...
Если вы можете или не можете воспроизвести это на других системах, пожалуйста, скажите мне об этом в Комментарии.
Большое спасибо!
Update
После installing Java 1.5 on Snow Leopard (Вздох) Я могу подтвердить, что это происходит с 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)
Update 3
Кажется, работает на Windows Vista тоже. Это делает этот выпуск Mac OS X 10.5 + 10.6, AFAIK.
Update 4
Эта ошибка рубриках Проблема ID # 7240026 на Apple.
Прогресс на этом? Я сталкиваюсь с аналогичной проблемой. – Nemi
Ничего еще ... Я задал вопрос о рассылке java-dev Apple и до сих пор не получил ответа. Мех. http://sourceforge.net/apps/trac/lilith/ticket/72 - это билет этой проблемы в моем приложении. Он имеет ссылку на немного улучшенную версию вышеприведенного примера кода. Пожалуйста, дайте мне знать, если вы найдете решение! Какова ваша конфигурация? – Huxi
Оказывается, моя проблема не связана с ускорителями. Я использовал KeyboardFocusManager для отключения ввода с клавиатуры при выполнении долговременной задачи в SwingWorker, и это был тот код, который не срабатывал. Поскольку я реализовал их в одно и то же время, и я видел вашу аналогичную проблему, я думал, что ускорители виноваты, но это не так. Удачи – Nemi