2012-03-10 38 views
2

キャンバス上に何かを描画してJFrameに追加し、このJFrameをフルスクリーンに設定しようとしています。私の問題はフルスクリーンモードでは黒い画面しか見えません。 画面が黒くなる前に、私はちょうどキャンバスのピンクの背景を見ることができます。Java - JFrameをフルスクリーンに設定すると、画面が黒くなる

JFrameに直接描画し、それをフルスクリーンに設定すると完全に正常に動作し、テストテキストが表示されます。私はCanvasを正しく表示することに問題があると仮定します。ここで

は私のコードです:

//graphicsDevice = GraphicsEnvironment.getLocalGraphicsEnvironment() 
//     .getDefaultScreenDevice(); 
public void setFullScreen(DisplayMode dm, JFrame window){ 
    window.setUndecorated(true); 
    window.setResizable(false); 
    graphicsDevice.setFullScreenWindow(window); 

    if(dm != null && graphicsDevice.isDisplayChangeSupported()){ 
     graphicsDevice.setDisplayMode(dm);   
    } 
} 

私がいない理由を誰もが手掛かりを持っています。ここでは

public class FullscreenTest extends Canvas { 

    private JFrame mainFrame; 

    public FullscreenTest(){ 
     this.mainFrame = new JFrame(); 
     JPanel contentPane = (JPanel) mainFrame.getContentPane(); 
     contentPane.add(this); 
    } 

    public void run(DisplayMode dm){ 
     setBackground(Color.PINK); 
     setForeground(Color.WHITE); 
     setFont(new Font("Arial", Font.PLAIN, 24)); 

     Screen s = new Screen(); 

     s.setFullScreen(dm, this.mainFrame); 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException exc) { exc.printStackTrace(); } 

     s.closeFullScreenWindow(); 
    } 

    public void paint(Graphics g){  
     g.drawString("This is some testtext", 200, 200); 
    } 

    public static void main(String[] args){ 
     DisplayMode dm = new DisplayMode(800, 600, 32, DisplayMode.REFRESH_RATE_UNKNOWN); 
     FullscreenTest test = new FullscreenTest(); 
     test.run(dm); 
    } 
} 

はScreen.setFullScreen(のDisplayMode dmと、JFrameのウィンドウ)メソッドが何をするかでありますJFrameのコンテンツは全画面でご覧いただけますか?

+0

setFullScreen()を呼び出した直後にthis.mainFrame.repaint()コールをポップすると違いがありますか?全画面表示に変更するとビットがダンプされるのだろうと思っていますが、再描画する必要はありません。 – JTeagle

+0

残念ながらそれは何も変わりません。画面がフルスクリーンモードになっている間に、画面が黒くなる前にキャンバスのピンクの背景が表示されます(repaint()もしなくても)。 – 1Q91

+0

実際には、私は問題は現在のスレッドがスリープ状態になっていると思います。現在のスレッドはUIスレッドなので、効果的にUIスレッドを一時停止し、動作させないようにしています。 run()を呼び出した後で、このクラスからThread.sleep()を取り出し、main()に入れてから、別のメソッドを追加してウィンドウを再び元に戻してください。そうすれば、私のスレッド理論が正しいとすれば、スリープはアプリケーションスレッドであり、UIスレッドではありません。 – JTeagle

答えて

3

1)あなたは(そこに本当に重要な理由でない場合)AWT with Swingを混合していないデモhere

    • ではなくThread.sleep(5000);使用Swing Timerを使用してEDTをブロックすることはありません三つの一般的な問題

      を持っています残りはhereであり、Canvasの代わりにJPanelを使用してください(Canvasの場合はpaintの方法です)、JPanelの場合はあなたの)

    • ではなくCanvasJFrameにあるとInitial Thread

      public static void main(String[] args){ 
      

      以上を意味invokeLater()にラップする必要がありますrellated Thread.sleep(5000);

    2)のSwing GUIによってロック

    3)in linked code exampleあなたはスウィングでバックグラウンドスレッドを使用する方法を教えてください

  • +0

    参考として、関連する例[here](http://stackoverflow.com/a/7457102/230513)があります。 – trashgod

    0

    私はmKorbelに同意します(実際には、彼の提案する訂正コードを使用しています)。さらに予測可能な結果を​​得るためのヒントとして、paint()メソッドの色をコントロールしてください。バックグラウンドのデフォルトの色は、システムによって異なる場合があります。私のシステムでは、それは薄い赤の背景に白いテキストを描きます。しかし、黒い背景に黒い文字を描くと、テストは「うまくいかない」ように見えます。

    0

    ねえ私は彼が同じ問題を抱えていて、プログラムを実行するたびに画面が黒くなります。

    public void paint(Graphics g){  
         g.drawString("This is some testtext", 200, 200); 
        } 
    

    あなたがしなければならないすべては「スーパー」を使用することである

    public void paint(Graphics g){ 
         super.paint(g); 
         g.drawString("This is some testtext", 200, 200); 
        } 
    
    :paintメソッドの一部で は、あなたが書いた、私はそれが道で素晴らしいですバッキーチュートリアルからだと思いいます

    私はそれを試しましたが、うまくいきました。

    +0

    superはスーパークラスのすべてのメソッドを使用しており、それを適用しています。 – Ayman

    関連する問題