2009-10-25 7 views
0

두 개의 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
.

+0

이것에 대한 진전이 있습니까? 나는 비슷한 문제를 겪고있다. – Nemi

+0

아직 아무것도 ... 나는 java-dev Apple 메일 링리스트에 질문을했으며 지금까지 답장을받지 못했다. Meh. http://sourceforge.net/apps/trac/lilith/ticket/72는 내 앱에서이 호의 티켓입니다. 위 예제 코드의 약간 향상된 버전에 대한 링크가 있습니다. 해결책을 찾으면 알려주세요. 당신의 구성은 무엇입니까? – Huxi

+0

내 문제는 액셀러레이터와 관련이 없다고 밝혀졌습니다. 나는 KeyboardFocusManager를 사용하여 SwingWorker에서 장기 실행 작업을 수행 할 때 키보드 입력을 사용하지 못하게하고 그 코드가 실패했다. 동시에 그들을 구현했기 때문에 비슷한 문제가있는 것을 보았습니다. 가속기는 책임이 있다고 생각했지만 그렇지 않았습니다. 행운을 빌어 요. – Nemi

답변

1

다음과 MyDialog에 클래스의 OkAction 클래스의 actionPerformed 메소드를 교체 :

public void actionPerformed(ActionEvent e) { 
      setVisible(false); 
      MyDialog.this.getParent().requestFocus(); 
     } 

(어쩌면 대화 상자가 모달이 아니기 때문에) OS X은 MyFrame에 포커스를 반환하지 않습니다. 대화 상자를 닫아 버리면 포커스가 MyFrame으로 자연스럽게 되돌아갑니다. 그러나 대화 상자를 단순히 숨기고있는 것이있을 수 있습니다.

+0

정말 고마워! 이 작품! – Huxi

0

Java (TM) SE 런타임 환경 (빌드 1.6.0_07-b06)을 사용하여 XP에서 제대로 작동합니다.

나는 Ctrl + O가 구성 요소 방향을 변경하기위한 가속기라고 생각하는 것 같습니다. 이 문제가 모든 단축키 또는 Ctrl + O에서만 발생하는지 궁금합니다.

편집 : 아마도이 제안을 잊어 버릴 수 있습니다. 나는 내가 이것을 생각할지도 모르는 곳을 찾거나 기억하지 못하고 내 테스트 프로그램에서 이것을 검증 할 수 없다.

+0

(모든 최신 보안 패치를 받으려면 적어도 6u15 또는 6u16 업데이트가있는 JRE 1.6.0을 실행해야합니다.) –

+0

나는 실제 작업을하지 않고 그냥 놀아 보려고합니다. . – camickr

+0

"Ctrl-O"는 임의의 예입니다. 가속기가 전혀 작동하지 않습니다. – Huxi

0

OS X 10.4 및 Java 버전 "1.5.0_19"가있는 Mac에서는 문제없이 실행했습니다.

두 개의 모달 대화 상자를 닫은 후에 메인 프레임에 포커스가 있는지 궁금합니다. 오랫동안 단축키를 사용하지는 않았지만, 단축키와 같이 프레임에 등록 된 단축키와 메뉴 막대에 등록 된 단축키에 대한 최근 변경 사항이있을 수 있습니다.

행운을 빈다.

+0

감사합니다. 이것은 낯선 사람과 낯선 사람이되고 있습니다. 그것은 Leopard에 묘사 된 것과 마찬가지로 잘못되었습니다. 나는 그것이 Windows Vista에서 같은 오작동을 보여 주지만 나는 확인을 기다리고 있다고 믿는다 ... – Huxi

+0

아니, 그것은 비스타에서도 작동하는 것 같다. – Huxi

0

나는 레오파드/10.5에 시도하고 프로그램 중 하나가 작동하지 않습니다 :

자바 5 (애플 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) 

자바 6 (SoyLatte/오픈 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)