質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.37%

  • Java

    16479questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    251questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

setUndecoratedを呼んだときにエラーが発生する

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 254

yukkuri

score 540

 前提・実現したいこと

JFrameを使っていて、フルスクリーン化をしようとしていました。
そこで、タイトルバーを消したかったのですが、その関数を読んだときエラーが発生しました。

 発生している問題・エラーメッセージ

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

 該当のソースコード

呼び出し元クラス(main関数)

    JylFrame jf = new JylFrame();
    jf.setUndecorated( false );
    jf.changefFullScreen();
    jf.setVisible( true );

JylFrame

public class JylFrame extends JFrame
{
    private short x = 0, y = 0;
    private short width = 640, height = 480;
    private String title = "frame";
    private boolean resize = false;
    private float widthRate  = 1.0f;
    private float heightRate = 1.0f;
    private Color background = new Color( 0xff000000, true );
    private boolean showsize = true;
    private boolean fullscreen = false;

    private GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    private GraphicsDevice gd = ge.getDefaultScreenDevice();
    private GraphicsConfiguration gc = gd.getDefaultConfiguration();

    public JylFrame()
    {
    super();
    initFrame();
    }

    public JylFrame( String title )
    {
    this();
    initFrame();
    setfTitle( title );
    }

    /**
     * フレームを初期の状態に戻します。
     */
    public void initFrame()
    {
    setfTitle( "frame" );
    setfLocation( (short)0, (short)0 );
    setfSize( (short)640, (short)480 );
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    setfBackground( 0xff000000 );
    setfResizable( false );
    }

    /**
     * このフレームの背景色を設定します。
     *
     * @param argb 背景色の ARGB 値
     *
     * @since Jyl - 1.0
     */
    public void setfBackground( int argb )
    {
    background = new Color( argb, true );
    setBackground( background );
    }

    /**
     * このフレームの背景色を設定します。
     *
     * @param c 背景色の Color
     *
     * @since Jyl - 1.0
     */
    public void setfBackground( Color c )
    {
    background = c;
    getContentPane().setBackground( c );
    }

    public void changefFullScreen()
    {
    if( !fullscreen ){
//        setUndecorated( false );
        gd.setFullScreenWindow( this );
    }else{
//        setUndecorated( true );
        gd.setFullScreenWindow( null );
    }
    fullscreen = !fullscreen;
    }

    /**
     * このフレームの位置を設定します。
     *
     * @param x フレームの位置
     * @param y フレームの位置
     *
     * @since Jyl - 1.0
     */
    public void setfLocation( short x, short y )
    {
    this.x = x; this.y = y;

    setLocation( this.x, this.y );
    }

    public void setfLocationCenter()
    {
    setfSize( width, height );
    setLocationRelativeTo( null );
    }

    /**
     * このフレームのリサイズ可否を設定します。
     *
     * @param resizable フレームのリサイズを許可する場合 { @code true}
     */
    public void setfResizable( boolean resizable )
    {
    this.resize = resizable;
    setResizable( resize );
    }

    /**
     * このフレームの描画範囲を推奨サイズに設定します。
     *
     * @param width このフレームのサイズ
     * @param height このフレームのサイズ
     *
     * @since Jyl - 1.0
     */
    public void setfSize( short width, short height )
    {
    this.width = width; this.height = height;
    short  framewidthsize = (short)(  this.width *  widthRate );
    short frameheightsize = (short)( this.height * heightRate );

    getContentPane().setPreferredSize( new Dimension( framewidthsize, frameheightsize ) );
    pack();

    setfBackground( background );
    setfTitle( title );
    }

    /**
     * このフレームの描画範囲を現在のサイズを基にして設定します。
     *
     * @param widthr  横幅の比率
     * @param heightr 高さの比率
     *
     * @since Jyl - 1.0
     */
    public void setfSizer( float widthr, float heightr )
    {
    this.widthRate = widthr; this.heightRate = heightr;
    short  framewidthsize = (short)(  width *  widthRate );
    short frameheightsize = (short)( height * heightRate );

    getContentPane().setPreferredSize( new Dimension( framewidthsize, frameheightsize ) );
    pack();

    setfBackground( background );
    setfTitle( title );
    }

    /**
     * このフレームのタイトルを設定します。引数を {@code "frame"}、640*480とすると、<br>
     * タイトルは {@code frame 640x480} となります。
     *
     * @param title フレームのタイトル
     *
     * @since Jyl - 1.0
     */
    public void setfTitle( String title )
    {
    this.title = title;
    short  framewidthsize = (short)(  width *  widthRate );
    short frameheightsize = (short)( height * heightRate );
    String newtitle = showsize == true ? this.title + " " + framewidthsize + "x" + frameheightsize : this.title;

    setTitle( newtitle );
    }

    /**
     * タイトルにフレームサイズを表示するか設定します。
     *
     * @param show フレームサイズを表示する場合 {@code true}
     *
     * @since Jyl - 1.0
     */
    public void setShowSize( boolean show )
    {
    showsize = show;
    setfTitle( this.title );
    }
}

 試したこと

javaのAPIを読んだり、ネットで調べました。
呼び出す位置を変えても駄目

 補足情報(FW/ツールのバージョンなど)

java8,eclipse,windowsです。
java8だからFX使えというコメントはなしでお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

特殊な例だと思いますが、コンストラクタを呼び出す前に呼び出したら動きました。

public JylFrame( boolean undecorated )
    {
    setUndecorated( undecorated );
    new JylFrame();
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/06 23:46

    こんにちわ
    エラーメッセージに「The frame is displayable」なんて出力するだけあって、frameが出来上がったらsetUndecoratedできないみたいですね

    解決はしたようですが、stackoverflowに似たような状況の人がいたようなので参考までにどうぞ
    https://stackoverflow.com/questions/875132/how-to-call-setundecorated-after-a-frame-is-made-visible

    キャンセル

  • 2018/10/07 10:55

    ネットにそのサイトでの質問が確かにありましたね。
    ですがそれを見ても解決しなかったので質問しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    16479questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    251questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。