BUG: Java Swing Key Bindings verlieren mit JDK 7 unter OSX mit awt setFullScreenWindow ihre Funktion

EDIT 16.01.2013: Die ursprüngliche Frage wurde gelöscht. Dies scheint ein Fehler mit dem JDK 7 unter Mac OS X zu sein. Ich habe einen Fehlerbericht bei Sun (Oracle) eingereicht.

Die folgende Datei verwendet die awt-Klasse GraphicsEnvironment und die Methode setFullScreenWindow, um ein Bild im Vollbildmodus anzuzeigen. Es sind keine Bilder enthalten, daher wird der Bildschirm beim Ausführen des Codes grau. Die Tastenbelegungen sollten jedoch weiterhin funktionieren.

Es gibt zwei Tastenbelegungen. Drücken Sie 'ENTER', um zu drucken "Enter wurde gedrückt". zu übertreiben. Durch Drücken von 'ESCAPE' sollte "Mit ESC-Taste beendetes Programm" gedruckt werden, um das Programm abzubrechen und zu beenden.

Unter Windows 7 64 und JDK Java SE 6 AND 7 funktionieren diese Tastenzuordnungen wie erwartet.

Unter Mac OS X 10.7 Lion und JDK Java SE 6 funktionieren diese Tastenzuordnungen wie erwartet.

Verwenden Sie unter Mac OS X 10.7 Lion und JDK Java SE 7 diese Tastenkombinationenhalt Arbeiten.

Wenn Sie ein Rollback auf JDK Java SE 6 ausführen, werden sie wieder funktionsfähig.

Ich weiß nicht, ob es andere Betriebssysteme betrifft.

Ich habe alle Versionen von JComponent.WHEN_IN_FOCUS usw. ausprobiert und keine dieser Optionen behebt das Problem.

Unten ist einSSCCE Das wird den Fehler nur reproduzieren, wenn Sie Mac OSX 10.7 und JDK Java SE 7 verwenden.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class FullScreen extends JFrame
{
    /*
     * screenImage is never set in this code. It can be set to any image
     * the error will still be present. Images have been omitted to simplify
     * the example case.
     */
    private Image screenImage;
    private int width;
    private int height;

    //Create panel for displaying images using paintComponent()
    private PaintPanel mainImagePanel;

    //Used for keybinding
    private Action enterAction;
    private Action escapeAction;
    private static final String enter = "ENTER";
    private static final String escape = "ESCAPE";

    public FullScreen()
    {
 /**********************************************
  ******THE BELOW LINES CAUSE THE ERROR*********
  **********************************************/

        /****************************************** 
         * Removes window framing and sets fullscreen mode.
         ******************************************/

        this.setUndecorated(true);
        GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this);

 /**********************************************
  ******THE ABOVE LINES CAUSE THE ERROR*********
  **********************************************/

        width = this.getWidth();
        height = this.getHeight();

        //Create panel so that I can use key binding which requires JComponent
        mainImagePanel = new PaintPanel();      
        add(mainImagePanel);

        /****************************************** 
         * Key Binding
         ******************************************/

        // Key bound AbstractAction items 
        enterAction = new EnterAction();
        escapeAction = new EscapeAction();

        // Gets the mainImagePanel InputMap and pairs the key to the action
        mainImagePanel.getInputMap().put(KeyStroke.getKeyStroke(enter), "doEnterAction");
        mainImagePanel.getInputMap().put(KeyStroke.getKeyStroke(escape), "doEscapeAction");

        // This line pairs the AbstractAction enterAction to the action "doEnterAction"
        mainImagePanel.getActionMap().put("doEnterAction", enterAction);
        mainImagePanel.getActionMap().put("doEscapeAction", escapeAction);

        /******************************************
         * End Key Binding
         ******************************************/
    }

    //Stretches and displays images in fullscreen window
    private class PaintPanel extends JPanel
    {
        @Override
        public void paintComponent(Graphics g) 
        { 
            if(screenImage != null)
            {
                super.paintComponent(g);
                g.drawImage(screenImage, 0, 0, width, height, this);
            }  
        }
    }

    /******************************************
     * User Input
     ******************************************/

    private class EnterAction extends AbstractAction
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("Enter was pressed.");
        }
    }

    private class EscapeAction extends AbstractAction
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("Program Terminated by ESC Key");
            System.exit(0);
        }
    }

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() 
            {
                FullScreen show = new FullScreen();
                show.setVisible(true);
            }
        });
    }
}

Die folgenden zwei Zeilen verursachen das Problem.

this.setUndecorated(true);
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this);

Antworten auf die Frage(3)

Ihre Antwort auf die Frage