2013-01-07 51 views
1

我在使所有操作系統(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(); 
} 
} 

回答

1

這是有點片斷,因爲我可以在同一時間將它工作並打破它。

隨着你的示例代碼,我添加

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

向該createFrame方法的結束,並代替註冊針對根窗格的動作,我註冊針對內容窗格

+0

通過「flaky」你的意思是它不是一個解決方案,對吧?我不幸現在無法測試它,因爲我無法訪問Mac。將它註冊到contentPane或rootPane之間有什麼區別? – jimmy

+0

鑑於你的例子,我可以工作。當我在EventQueue.invokeLater中封裝主要方法的內容時,它停止工作 - 所以不,我不認爲它是可靠的解決方案,但是可能會讓你朝着正確的方向移動 – MadProgrammer

+0

註冊鍵綁定與內容窗格與通常的根窗格相同,內容窗格駐留在根窗格內 - 我也可以使內容窗格成爲可聚焦的;) – MadProgrammer