【问题标题】:Java Swing fullscreen with keyboard input on Mac OS X在 Mac OS X 上使用键盘输入的 Java Swing 全屏
【发布时间】:2013-01-07 07:39:15
【问题描述】:

让我的 Java JFrame 在所有操作系统(Windows、Mac、Linux)上全屏显示时遇到了一些问题。似乎我发现的任何解决方案都可以在一个操作系统上运行,但不能在其他操作系统上运行,或者有一些其他严重的错误。我想使用 setFullScreenWindow(window w) 方法正确启动全屏,因为 setExtendedState(...) 在 Mac/Linux 上不起作用,因为菜单栏和任务栏仍然可见。

在 Java 7 出现之前,setFullScreenWindow(...) 方法在所有环境中都可以正常工作,现在似乎存在一个问题,即一旦您进入全屏模式,应用程序就不再响应 Mac OS X 上的关键事件。该应用程序在 Windows 上运行良好。

有没有人知道我该如何解决这个问题?

注意: 此处描述的解决方法 (FullScreen Swing Components Fail to Receive Keyboard Input on Java 7 on Mac OS X Mountain Lion) 不适用于 Windows,因为它会导致 JFrame 闪烁并且无法正常打开。

此处描述的全屏方法与下面使用的方法相同,但由于键输入问题而无法使用:(How to make a JFrame really fullscreen?)

示例代码:

import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;

public class FullScreenKeyTest extends JFrame {

public void createFrame() {
    initKey();
    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    this.setUndecorated(true);
    this.setVisible(true);
    gd.setFullScreenWindow(this);
}

private void initKey() {
    Action keyAction = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Escape key pressed");
            setVisible(false);
            System.exit(0);
        }
    };
    this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "keyPress");
    this.getRootPane().getActionMap().put("keyPress", keyAction);
}

public static void main(String[] args) {
    FullScreenKeyTest testFrame = new FullScreenKeyTest();
    testFrame.createFrame();
}
}

【问题讨论】:

    标签: java macos swing fullscreen


    【解决方案1】:

    这有点不稳定,因为我可以让它工作并同时破坏它。

    我添加了您的示例代码

    getContentPane().setFocusable(true);
    getContentPane().requestFocus();
    

    createFrame 方法的末尾,我没有在根窗格中注册操作,而是在内容窗格中注册

    【讨论】:

    • “片状”是指它还不是解决方案,对吧?不幸的是,我现在无法测试它,因为我无法使用 Mac。注册到 contentPane 或 rootPane 有什么区别?
    • 鉴于你的例子,我可以让它工作。当我将 main 方法的内容包装在 EventQueue.invokeLater 中时,它停止工作 - 所以不,我不会认为它是可靠的解决方案,但可能会让你朝着正确的方向前进
    • 将键绑定注册到与根窗格相对的内容窗格之间的区别通常是,内容窗格驻留在根窗格中 - 我也可以使内容窗格具有焦点;)跨度>
    • @jimmy 我尝试了许多不同的排列,但无法让它可靠地工作,这对我来说听起来像是一个错误
    • 感谢您分享您的方法。我在 Oracle 中发现了一个错误,但我不太相信它会被查看...
    【解决方案2】:

    我发现,如果您使用本机 OS X Lion 全屏 API,则键盘输入可以正常工作。查看问题的解决方案Fullscreen feature for Java Apps on OSX Lion

    【讨论】:

      猜你喜欢
      • 2012-10-15
      • 2010-11-06
      • 2013-11-29
      • 2011-06-04
      • 1970-01-01
      • 2016-08-10
      • 2011-03-25
      • 1970-01-01
      • 2014-02-27
      相关资源
      最近更新 更多