1

编辑 1/16/2013:原始问题已被删除。这似乎是 mac OSX 上 JDK 7 的一个错误。我已经向 Sun (Oracle) 提交了错误报告。

下面的文件使用 awt 类 GraphicsEnvironment 和方法 setFullScreenWindow 将图像显示为全屏。不包含任何图像,因此运行代码时屏幕将是灰色的。但是,键绑定应该仍然有效。

有两个键绑定。按“ENTER”应打印“Enter was press”。到标准输出。按“ESCAPE”应将“程序由 ESC 键终止”打印到标准输出并退出程序。

使用 Windows 7 64 和 JDK Java SE 6 AND 7,这些键绑定按预期工作。

使用 Mac OSX 10.7 Lion 和 JDK Java SE 6,这些键绑定按预期工作。

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

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

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

我已经尝试了所有版本的 JComponent.WHEN_IN_FOCUS 等......但这些选项都没有解决问题。

以下是仅当您使用 Mac OSX 10.7 和 JDK Java SE 7 时才会重现错误的SSCCE 。

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

3 回答 3

5

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

There is a workaround!

After you make it fullscreen, do frame.setVisible(false); then frame.setVisible(true). Why does it work? Consult the above link.

于 2013-11-03T09:33:20.203 回答
3

正如这里所指出的,一些静态最终变量可以有效地内联在依赖类中。如果在另一个类中静态定义,则隐式将 a 连接KeyStroke到 aString并将其连接String到a 的键绑定Action可能会表现出这种行为。这里String建议的一个简单的权宜之计是进行完整构建。如果这样可以解决问题,您可能能够向后工作以减轻依赖性。

于 2013-01-14T12:27:16.363 回答
2

在与此代码具有功能键绑定的 mac 系统上,我安装了 jdk-7u11-macosx-x64.dmg。安装后键绑定不再起作用。在这一点上,我很有信心这是新版本的 JDK for OSX 的一个错误,并将报告它。

感谢大家试图帮助解决这个问题,但事实证明代码很好。

于 2013-01-16T20:32:39.153 回答