Frage

Ich habe das Problem, dass die Beschleuniger von JMenuItems nicht mehr arbeiten nach zwei weiteren JDialogs direkt nach einem zeigt.

Bitte werfen Sie einen Blick auf dieses kleine Beispiel, das das Problem reproduziert:

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);
            }
        }
    }
}

Kompilieren es javac DialogBug.java mit und führen Sie es java DialogBug ausgeführt wird.

Sie werden zwei mit "Ok" -Buttons sehen. Entlassen beiden Dialoge anklicken. „Strg-O“ Drücken Sie nun. Dies sollte „Open ausgeführt“ auf der Konsole gedruckt werden, aber das wird nicht passieren. Klicken Sie nun auf das Menü „Datei“. Jetzt "Strg-O" wird funktionieren wie erwartet.

Wenn Sie die App mit jedem Argumente starten, zum Beispiel java DialogBug x dann nur ein Dialog öffnet und „Strg-O“ funktionieren wird sofort nach dem Dialog entlassen, wie erwartet.

Meine Umgebung ist die folgende:

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)

Aber soweit ich weiß, ist diese App verhält sich ähnlich in anderen VMs.

Bitte helfen Sie mir!
Ich wirklich habe keine Ahnung, was schief gehen könnte. Wenn dies ein Java Bug ist (und ich erwarte, dass es sein), dann lassen Sie es mich wissen, wenn Sie eine Abhilfe haben ...

Wenn Sie oder diese auf anderen Systemen nicht wiedergeben kann mir bitte sagen, so in den Kommentaren.
Vielen Dank!

Aktualisieren
Nach dem Installation Java 1.5 auf Snow Leopard ( seufzen ) ich kann bestätigen, dass dies mit 1.5.0_19 passiert, zumindest auf Snow Leopard auch.

Update 2
Funktioniert bei mir unter 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
Scheint auf Windows Vista zu arbeiten. Dies macht es zu einem Mac OS X 10.5 + 10.6 Ausgabe, AFAIK bisher.

Update 4
Dieser Fehler wird unter Problem ID # 7240026 bei Apple eingereicht.

War es hilfreich?

Lösung

Setzen Sie die Methode actionPerformed der OkAction Klasse in der MyDialog Klasse mit dem folgenden:

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

Aus irgendeinem Grund (vielleicht, weil die Dialoge sind nicht modal), OS X kehrt nicht den Fokus auf Ihre MyFrame. Der Fokus kehrt natürlich MyFrame, wenn Sie die Dialoge schließen, indem sie zu schließen, aber es könnte etwas sein, mit einfach die Dialoge versteckt.

Andere Tipps

Funktioniert bei mir auf XP fein mit Java (TM) SE Runtime Environment (build 1.6.0_07-b06).

Aus irgendeinem Grund, den ich scheinen zu denken, dass Strg + O der Beschleuniger eine Komponenten Orientierung zu ändern. Nur frage mich, ob dies mit allen Beschleunigern oder nur Strg + O?

geschieht

Edit: Sie können sich wahrscheinlich diesen Vorschlag vergessen. Ich kann nicht finden / Rückruf scheinen, wo ich dies gedacht haben und und kann diese in jedem meiner Testprogramme nicht überprüfen.

Ich lief es ohne Probleme auf meinem Mac, die OS X 10.4 und Java-Version "1.5.0_19" hat.

Ich frage mich, ob, nachdem Sie die zwei modalen Dialoge der Hauptrahmen den Fokus hat schließen. Ich habe nicht Beschleuniger in einer langen Zeit verwendet wird, aber ich denke, dass vielleicht gibt es einige kürzliche Änderung Beschleuniger in der Menüleiste registrierten in Bezug auf war und Beschleuniger im Rahmen (wie Shortcuts) registriert.

Viel Glück damit.

Ich habe versucht, auf Leopard / 10.5 und das Programm funktioniert nicht mit entweder:

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-Port)

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top