我在使所有操作系統(Windows,Mac,Linux)上的Java JFrame全屏時遇到了一些問題。看來無論我在哪個解決方案中找到它,它都可以在一個操作系統上運行,但不會在其他操作系統上運行,或者有其他嚴重的錯誤我想使用setFullScreenWindow(window w)方法來正確啓動全屏,因爲setExtendedState(...)在Mac/Linux上不起作用,因爲菜單欄和任務欄仍然可見。在Mac OS X上使用鍵盤輸入的Java Swing全屏幕
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();
}
}
通過「flaky」你的意思是它不是一個解決方案,對吧?我不幸現在無法測試它,因爲我無法訪問Mac。將它註冊到contentPane或rootPane之間有什麼區別? – jimmy
鑑於你的例子,我可以工作。當我在EventQueue.invokeLater中封裝主要方法的內容時,它停止工作 - 所以不,我不認爲它是可靠的解決方案,但是可能會讓你朝着正確的方向移動 – MadProgrammer
註冊鍵綁定與內容窗格與通常的根窗格相同,內容窗格駐留在根窗格內 - 我也可以使內容窗格成爲可聚焦的;) – MadProgrammer