Jmenuitem Accelerator는 2 개의 비 모달 jdialogs를 보여준 후 작동하지 않습니까? (Mac 만?)

StackOverflow https://stackoverflow.com/questions/1622386

문제

나는 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top