2009-07-20 20 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

フルスクリーンを取りたいウィンドウ(JFrame、など)である
com.apple.eawt.FullScreenUtilities.setWindowCanFullScreen(window,true); com.apple.eawt.Application.getApplication().requestToggleFullScreen(window); 

? –

+1

@ mmyers:それは答えです。それを追加してください、私は誘惑に抵抗することはできません – OscarRyz

答えて

12

私はあなたの問題はここにあると思う:

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

finallyブロックが常に実行されているので、どのようなここで起こることは、あなたのウィンドウが一瞬(その場合)のために全画面表示になり、その後放棄していることですすぐに画面を表示します。

Javadocsによれば、以前にsetFullScreenWindow(this)と呼ばれていた場合は、setVisible(true)は不要です。

だから私はこれにコンストラクタを変更します:OS X(10.7以降)で

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から取得されました。このフォームは、アプリケーションが終了後に画面を保持しないようにするためのものです。あまりにも早くリリースされないように、画面にロックを積極的に置かなければなりません。 ありがとう! –

+2

そこに「...」と書かれていますか?それは、ウィンドウが閉じられるまでブロックするものでなければなりません。 try ... finallyメソッドは、アプリケーションが終了したときにアプリケーションが画面を解放しないようにするための例外を防ぎます。 (奇妙なことに、 'setFullScreenWindow'はウィンドウを可視にしても、' setVisible'のようにブロックしません)。 –

+0

グラフィックデバイスはjframeのように振る舞います。つまりjpannelsを追加できます? – fftk4323

6

を、可能なネイティブフルスクリーンモードを使用することをお勧めします。あなたは使用する必要があります:

windowあなたはなぜあなたはあなたのウィンドウをフルスクリーンを作っているし、すぐにsetFullScreenWindow(null)を呼び出す
+0

素敵!少なくともOS Xでは、メニューアクセラレータは一般的なグラフィックスのフルスクリーンモードでは機能しないため、これが必要でした。これは本当のOS Xの解決策です+1 –

+0

これらのクラスをテストしてコードを正しく実行するには、リフレクションが必要でしょうか? –

+0

@UnitedStatesOfAmerica反射は一方向です。代わりに、ここで提供されているように、非リンゴプラットフォームでスタブジャーを使うこともできます:http://stackoverflow.com/a/2639395 –

関連する問題