Jmenuitem Accelerator는 2 개의 비 모달 jdialogs를 보여준 후 작동하지 않습니까? (Mac 만?)
-
06-07-2019 - |
문제
나는 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-O"를 누릅니다. 이것은 콘솔에 "오픈 실행"을 인쇄해야하지만 이런 일이 발생하지 않습니다. 이제 "파일"메뉴를 클릭하십시오. 이제 "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에 Java 1.5 설치 (한숨을 쉬다) 적어도 스노우 레오파드에서도 이것이 1.5.0_19에서도 발생한다는 것을 확인할 수 있습니다.
업데이트 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
이 버그는 Apple의 문제 ID #7240026에 따라 제기됩니다.
해결책
MyDialog 클래스의 OKAction 클래스의 ActionPerformed 메소드를 다음과 같이 바꾸십시오.
public void actionPerformed(ActionEvent e) {
setVisible(false);
MyDialog.this.getParent().requestFocus();
}
어떤 이유로 (대화 상자가 모달이 아니기 때문에) OS X는 초점을 MyFrame에 반환하지 않습니다. 대화 상자를 폐쇄하여 대화를 닫으면 초점이 자연스럽게 마이 프레임으로 돌아갑니다. 그러나 단순히 대화를 숨기는 것이있을 수 있습니다.
다른 팁
Java (TM) SE 런타임 환경을 사용하여 XP에서 나에게 잘 작동합니다 (빌드 1.6.0_07-B06).
어떤 이유로 Ctrl+O가 구성 요소 방향을 변경하기위한 가속기라고 생각하는 것 같습니다. 이것이 모든 가속기 또는 Ctrl+O에서만 발생하는지 궁금하십니까?
편집 : 아마도이 제안을 잊을 수 있습니다. 나는 이것을 생각했던 곳을 찾거나 기억할 수없고 테스트 프로그램에서는 이것을 확인할 수 없습니다.
OS X 10.4와 Java 버전 "1.5.0_19"가있는 Mac에서 문제없이 실행했습니다.
두 개의 모달 대화 상자를 닫은 후 메인 프레임에 초점이 맞는지 궁금합니다. 나는 오랫동안 가속기를 사용하지 않았지만 메뉴 막대에 등록 된 가속기와 프레임에 등록 된 가속기 (단축키와 같은)와 관련하여 최근의 변화가 있었을 것입니다.
행운을 빕니다.
Leopard/10.5에서 시도했는데 프로그램은 다음 중 하나와 함께 작동하지 않습니다.
Java 5 (Apple 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 (Soylatte/Open 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)