BUG:的Java Swing键绑定在OSX失去功能的JDK 7 AWT setFullScreen

2019-07-18 04:11发布

编辑2013年1月16日:原来的问题已被删除。 这似乎是在Mac OSX上的JDK 7的错误。 我已经申请与Sun(甲骨文)的bug报告。

下面的文件使用AWT类GraphicsEnvironment中和setFullScreenWindow以显示图像全屏的方法。 无图像都包括在内,因此在运行代码的时候,屏幕会显示为灰色。 该键绑定应该,但是,仍然工作。

有两个关键的绑定。 按“ENTER”应打印“进入被按下。” 到stdout。 按“ESCAPE”应打印“程序通过ESC键终止”到标准输出和退出程序。

使用Windows 7 64和JDK的Java SE 6和7,这些键绑定正常工作。

使用Mac OSX 10.7狮子和JDK的Java SE 6,这些键绑定正常工作。

使用Mac OSX 10.7狮子和JDK Java SE 7中,这些键绑定停止工作。

回滚到JDK的Java SE 6使他们重新开始工作。

我不知道这是否会影响其他操作系统。

我已经试过的JComponent.WHEN_IN_FOCUS等所有版本......和这些选择都不解决问题。

下面是一个SSCCE仅当您使用的是Mac OSX 10.7和JDK Java SE 7中,将重现错误。

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

所以,下面两行导致了问题。

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

Answer 1:

http://mail.openjdk.java.net/pipermail/macosx-port-dev/2012-November/005109.html

有一个解决办法!

之后你让它全屏,做frame.setVisible(false); 然后frame.setVisible(true) 。 为什么它的工作? 请教上面的链接。



Answer 2:

如前所述这里 ,一些静态变量,最终可以有效的内联依赖类。 键绑定,它隐含一个连接KeyStrokeString和相同String到一个Action ,如果可能会出现这种行为String在另一个类静态定义。 一个简单的权宜之计,建议在这里 ,是做一个完整的构建。 如果能解决问题,你可能能够向后工作,以减轻依赖。



Answer 3:

在Mac系统,该系统具有功能键与此代码结合我jdk安装-7u11-MacOSX的-x64.dmg。 安装后的键位不再起作用。 在这一点上,我非常有信心,这是JDK的OSX的新版本中的错误,将报告它。

谢谢大家的努力帮助解决这个问题,但事实证明代码是好的。



文章来源: BUG: Java Swing Key Bindings Lose Function with JDK 7 in OSX with awt setFullScreenWindow