Mac OS X 上带有键盘输入的 Java Swing 全屏

标签 java macos swing fullscreen

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

setFullScreenWindow(...) 方法在 Java 7 出现之前在所有环境中都运行良好,现在似乎存在一个问题,即一旦进入全屏模式,应用程序就不再响应 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();
}
}

最佳答案

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

通过您的示例代码,我添加了

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

createFrame 方法的末尾,我没有针对根 Pane 注册操作,而是针对内容 Pane 注册

关于Mac OS X 上带有键盘输入的 Java Swing 全屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191776/

相关文章:

java - 无需直接调用 drawnow() 的响应式 MATLAB GUI

java - 如何将 jar 附加到正在执行作业的 Spark 集群?

java - 为 Jinq 创建查询时是否可以使用 Predicate<T> ?

macos - 漏洞?在 codesign --remove-signature 功能中

android - 无法加载 Android 应用程序的 Logo

java - Swing/SwingWorker 初学者的问题

java - 开始实现 rowsorter 和 rowfilter java 1.4

java - 如何从右到左每 'd' 位打印一个带有逗号的整数

Java读取文本文件并搜索一行

cocoa - 如何显示从 xib 加载的工作表? (MacOSx)