2009-07-20 66 views
8

我一直在嘗試並未能在OSX系統的主顯示器上使用java全屏模式。無論我嘗試過什麼,我都無法擺脫屏幕頂部的「蘋果」菜單欄。我真的需要在整個屏幕上繪畫。任何人都可以告訴我如何擺脫菜單?如何在OSX上使用Java執行全屏

我附上了一個展示問題的示例類 - 在我的系統中,菜單仍然可見,我期望看到一個完全空白的屏幕。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.JFrame; 

public class FullScreenFrame extends JFrame implements KeyListener { 

    public FullScreenFrame() { 
     addKeyListener(this); 
     setUndecorated(true); 
     GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

     if (gd.isFullScreenSupported()) { 
      try { 
       gd.setFullScreenWindow(this); 
      } 
      finally { 
       gd.setFullScreenWindow(null); 
      } 
     } 
     else { 
      System.err.println("Full screen not supported"); 
     } 

     setVisible(true); 
    } 

    public void keyTyped(KeyEvent e) {} 
    public void keyPressed(KeyEvent e) {} 
    public void keyReleased(KeyEvent e) { 
     setVisible(false); 
     dispose(); 
    } 

    public static void main (String [] args) { 
     new FullScreenFrame(); 
    } 
} 
+1

爲什麼你讓你的窗口全屏,然後立即調用setFullScreenWindow(空)的窗口(JFrame等)? – 2009-07-20 20:41:29

+1

@ mmyers:這就是答案。請加上是這樣的,我無法抗拒誘惑 – OscarRyz 2009-07-20 20:48:30

回答

12

我覺得你的問題是在這裏:

try { 
     gd.setFullScreenWindow(this); 
} 
finally { 
     gd.setFullScreenWindow(null); 
} 

finally塊總是執行,因此,這裏所發生的是,你的窗口變成全屏了短暫的時間(如果),然後放棄了立即屏幕。

此外,根據Javadocs,如果您以前稱爲setFullScreenWindow(this),則不需要setVisible(true)

所以我會在構造函數改成這樣:

public FullScreenFrame() { 
    addKeyListener(this); 

    GraphicsDevice gd = 
      GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

    if (gd.isFullScreenSupported()) { 
     setUndecorated(true); 
     gd.setFullScreenWindow(this); 
    } else { 
     System.err.println("Full screen not supported"); 
     setSize(100, 100); // just something to let you see the window 
     setVisible(true); 
    } 
} 
+0

謝謝 - 這是有效的! try - finally構造取自http://java.sun.com/docs/books/tutorial/extra/fullscreen/exclusivemode.html,它建議使用這種形式來阻止應用程序在退出後保留屏幕 - 但似乎我必須主動將鎖定在屏幕上以防止它被釋放得太早。 謝謝! – 2009-07-21 06:52:37

+2

注意那裏的「...」?這就是阻塞窗口關閉之前的事情。 try ... finally方法只是防止異常,這可能會讓應用程序在完成時釋放屏幕。 (奇怪的是,即使'setFullScreenWindow'使窗口可見,它不會像'setVisible'那樣阻塞。我想知道這是否是有意設計的。) – 2009-07-21 14:20:12

+0

現在圖形設備的行爲就像是一個jframe,也就是說你可以爲它添加jpannels ? – fftk4323 2013-10-01 02:16:54

6

在OS X(10.7或更高版本),這是更好地使用可用的本地全屏模式。您應該使用:

com.apple.eawt.FullScreenUtilities.setWindowCanFullScreen(window,true); 
com.apple.eawt.Application.getApplication().requestToggleFullScreen(window); 

其中window是要採取全屏

+0

太棒了!我需要這個,因爲至少在OS X上,菜單加速器不能在典型的圖形全屏模式下工作。這是真正的OS X解決方案+1 – 2015-09-03 00:56:35

+0

您需要反射才能測試這些類並正確運行代碼? – 2015-09-09 13:28:57

+0

@UnitedStatesOfAmerica反思是一種方式。或者,您可以在非蘋果平臺上使用存根jar,如下所示:http://stackoverflow.com/a/2639395 – 2015-09-09 23:00:41

相關問題