1

我在让我的 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 闪烁并且无法正确打开。

此处描述的全屏方法与下面使用的方法相同,但由于键输入问题而无法使用:(如何使 JFrame 真正全屏?

示例代码:

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

2 回答 2

1

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

使用您的示例代码,我添加了

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

createFrame方法结束时,我没有在根窗格中注册操作,而是在内容窗格中注册

于 2013-01-07T08:45:27.743 回答
0

我发现如果您使用本机 OS X Lion 全屏 API,键盘输入会起作用。请参阅OSX Lion 上 Java 应用程序的全屏功能问题的解决方案。

于 2013-10-08T23:33:01.753 回答