当前位置: 首页 > 面试题库 >

BUG:具有awt setFullScreenWindow的OSX中的JDK 7使Java Swing键绑定失去功能

卢作人
2023-03-14
问题内容

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

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

有两个键绑定。按下“ ENTER”(回车)应打印“按下了回车”。到标准输出。按“ 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等…并且这些选项都不能解决问题。

下面是一个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);

问题答案:

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

有一个解决方法!

你让它全屏后,做frame.setVisible(false);那么frame.setVisible(true)。为什么行得通?请查阅上面的链接。



 类似资料:
  • 问题内容: 我是Java图形和线程的新手,我正在尝试制作一个游戏(特别是Pong)。这个想法是两个人可以在同一个键盘上玩(即,有两个通过不同键控制的拨盘)。目前,两个玩家都无法同时移动其球拍。 有针对这个的解决方法吗?单独的线程是答案吗? 如果可能的话,我希望这些拨片能够同时(至少在表面上)移动。 更新:似乎使用存储按下的键是最好的选择。我已经做到了(并且可以正常工作),但是我想知道是否其中的任何

  • 我想在模板引擎的帮助下生成有效的JSON。特别是,我希望引擎用一个模型类的属性替换模板中的占位符。引擎应该允许使用转换器来处理复杂的类,如。此外,我不想显式地处理模板本身中的列表,而是希望任何类似集合的类型生成有效的JSON数组。 这可以是模板的一个示例: 我想从具有relations、firstname和lastname属性的模型中替换此模板中的变量(、、)。这也应该适用于嵌套属性。(例如:)

  • 我们想用雄辩的ORM和Laravel 5实现复合主键http://www.mbarendezvous.com/ 据我所知,它目前还没有得到雄辩者的支持。请建议最好的替代方案。

  • 问题内容: 一段时间以来,我们的Java应用程序已预先与Windows上的JRE捆绑在一起。我们有一个用C语言编写的启动器小应用程序,它使该应用程序使用我们预先捆绑的JRE。现在,随着苹果公司努力逐步淘汰Java,我们已经决定谨慎对待OSX上的类似产品。在OSX上使用预捆绑的JRE的最佳方法是什么? 问题答案: 即使我觉得这不是一个好主意(请参阅下文),您也可以将OpenJDK之类的JVM捆绑在一

  • 在Visual Studio 2019中,您可以通过按住alt并使用鼠标向下拖动来编辑多行,然后您可以键入,它将在选定的行上插入文本(当VS中的块注释违反了您的代码样式规则时,这非常有用): 我以前曾使用shift alt向下箭头的键盘组合来选择多行以达到相同的目的,但此绑定已在Visual Studio 2019中停止工作。 任何人都可以指出我需要在工具中重新映射的绑定 我已经安装了reshar

  • 问题内容: 我的目标是在编辑器上以VK-ENTER结尾的任何输入,它执行操作pindah(正在添加新行并设置光标在新行上闪烁)。抱歉,我无法从该示例中学习。 有办法吗? 这是我的代码(不包括导入,因为Eclipse会自动建议它): 问题答案: 不是答案,而是关于您代码的一些注释。 首先,您需要了解事件调度线程(EDT)。GUI组件的更新需要在EDT上完成。 通常,您不需要保留嵌套的SwingUti