두 개의 JDialog를 서로 직접적으로 보여준 후에 JMenuItems의 액셀러레이터가 더 이상 작동하지 않는다는 문제점이 있습니다. 두 개의 모달이 아닌 JDialog를 표시 한 후 JMenuItem 단축키가 작동하지 않습니까? (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 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)
그러나 내가 아는 한이 응용 프로그램은 다른 VM에서 유사한 동작합니다.
도와주세요!
나는 무엇이 잘못 될지 전혀 모른다. 이것이 Java 버그 인 경우 해결 방법이 있으면 알려주십시오.
다른 시스템에서이 코드를 재현 할 수 있거나 재사용 할 수없는 경우 알려주십시오. 코멘트.
감사합니다.
나는이 적어도 스노우 레오파드 (Snow Leopard)에, 너무, 1.5.0_19로 발생하는 것을 확인할 수
installing Java 1.5 on Snow Leopard (한숨) 후 업데이트.
업데이트 Windows XP에서 나를 위해 2
작품.
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를 지금까지 만들었습니다.
업데이트이 버그는 애플에서 문제 ID # 7240026 아래에 제출 한 4
.
이것에 대한 진전이 있습니까? 나는 비슷한 문제를 겪고있다. – Nemi
아직 아무것도 ... 나는 java-dev Apple 메일 링리스트에 질문을했으며 지금까지 답장을받지 못했다. Meh. http://sourceforge.net/apps/trac/lilith/ticket/72는 내 앱에서이 호의 티켓입니다. 위 예제 코드의 약간 향상된 버전에 대한 링크가 있습니다. 해결책을 찾으면 알려주세요. 당신의 구성은 무엇입니까? – Huxi
내 문제는 액셀러레이터와 관련이 없다고 밝혀졌습니다. 나는 KeyboardFocusManager를 사용하여 SwingWorker에서 장기 실행 작업을 수행 할 때 키보드 입력을 사용하지 못하게하고 그 코드가 실패했다. 동시에 그들을 구현했기 때문에 비슷한 문제가있는 것을 보았습니다. 가속기는 책임이 있다고 생각했지만 그렇지 않았습니다. 행운을 빌어 요. – Nemi