2017-10-18 33 views
0

私は、最新のIntelliJコミュニティ版で開発しているWindowsマシンでJava8を使用しています。 JFrameをフルスクリーンにするには、私が検証したい1つの異なる動作に直面したところで、以下の解決策を見つけます。私はJFrameのフルスクリーンを作るためにライン以下の3を配置する必要がありソリューションを1としてJFrame full screenJFrameを装飾なしで全画面表示

から取っ

ソリューション:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true); 
frame.setVisible(true); 

しかし、私のプロジェクトで、私はそのクラスのAppFrame.javaを作成しましたJFrameを拡張します。そして、デフォルトのコンストラクタでは、フォントなどの基本的なプロパティを設定し、重要な可視性をtrueに設定しました。

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

public class AppFrame extends JFrame { 

    AppFrame() { 
     Font baseFont = new Font("Dialog", Font.PLAIN, 12); 
     setFont(baseFont); 
     setLocationRelativeTo(null); 
     setBackground(Color.WHITE); 
     setForeground(Color.black); 
     setLayout(new FlowLayout()); 
     setVisible(true); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 
} 

そして、私はそれがエラーを下回る得る最大化するために、3つのライン(とか、すでにAppFrameから来ているのsetVisible、なし)の上に配置しようとするときAppFrameを拡張するクラスで:として

Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923) 

(私が検証したい)解決策の一部 - 実験的にAppFrame.javaからsetVisible(true)を削除したところ、AppFrameを拡張しているすべてのクラスに影響が出るので、私のクラスからframe.setUndecorated(true);も削除してsetVisible AppFrameで。そして例外はなくなりました。またframe.setUndecorated(true);私はJFrameのタイトルバーを削除すると思います。また、以下の

はJFrameのののjavadocからの抜粋です:

A frame may have its native decorations (i.e. Frame and Titlebar) turned off with setUndecorated. This can only be done while the frame is not displayable.

誰かがこの動作を確認することができればそれは素晴らしいことです。

+2

私はあなたが確認したいものがわかりません。ドキュメントはかなり明確です。 – MadProgrammer

+2

* "AppFrame.javaからsetVisible(true)を削除しました"これは良いことだと主張するでしょう。なぜなら、いつAppFrameが可視にすべきかについての判断を下すべきではないということです。これは、子クラスに最も近い実装の詳細です。 – MadProgrammer

+1

ウィンドウを最大化したい場合['setExtendedState'](https://docs.oracle.com/javase/8/docs/api/java/awt/Frame.html#setExtendedState-int-) – MadProgrammer

答えて

0

setVisibleの前に、setUndecoratedを呼び出す必要があります。したがって、他の選択肢はありませんが、setVisibleの基本クラス呼び出しを削除し、子クラスで毎回呼び出すことになります。

+0

を使用することもできます。これは通常の方法です(?) invokeLaterのコンストラクタの外でsetVisibleを呼び出す。 –

+0

「他の選択肢はありません」は、私の答えで強調表示されているように、不正確なステートメントです。ゼロパラメータ初期化子は、私の知る限りでは、ASMが含まれるプログラミング言語での要件ではありません。 – Wayne

0

パラメータを使用するようにイニシャライザを変更します。よろしくで

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

public class AppFrame extends JFrame { 

    AppFrame(boolean undecorated, boolean visible) { 
     Font baseFont = new Font("Dialog", Font.PLAIN, 12); 
     setFont(baseFont); 
     setLocationRelativeTo(null); 
     setBackground(Color.WHITE); 
     setForeground(Color.black); 
     setLayout(new FlowLayout()); 
     setExtendedState(JFrame.MAXIMIZED_BOTH); 
     setUndecorated(undecorated); 
     setVisible(visible); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 
} 

へ:

A frame may have its native decorations (i.e. Frame and Titlebar) turned off with setUndecorated. This can only be done while the frame is not displayable.

はこれだけで、あなたがこれをしなければならないことを述べて AppFrame() {setUndecorated(undecorated);と完了setVisible(visible);

ソリューション、その後初期化子に追加AppFrame(boolean undecorated, boolean visible) {に変更する必要がありますsetVisible(true);に電話をかける前にsetUndecoratedを安全に呼び出すことができるかどうかを判断するには、if (!isDisplayable()) { ... }

関連する問題