5

もともと (私の前の質問「Java で JFrames を最大化されたウィンドウとして開始する方法」を参照してください)、最大化された状態で開始するウィンドウを作成したかったのです。このコードはこれを実現します:

public static void main(String[] args)  {

JFrame frame = new JFrame();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);

}

ただし、このウィンドウを元に戻すと、実質的に存在しないバーになります。これを解決するために、setSize() を使用してウィンドウのサイズを設定します。これは機能しますが、ウィンドウのサイズを変更できるという別の問題があります。

この問題を解決するために、setResizable(false); を設定しました。そして、これはこれまでの私のコードです:

public static void main(String[] args) {

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    JFrame frame = new JFrame("Jedia");
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setSize(screenSize);
    frame.setResizable(false);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

ただし、現在、ウィンドウは (最大化ではなく) 指定されたサイズで開始され、元に戻すことはできません。

それで、私の質問は、どうすればウィンドウを最大化して開始し、元に戻すときのサイズを指定して、サイズ変更を不可能にすることができますか? または、最初は最大化されていて元に戻すことができないウィンドウを作成しますか?

4

4 に答える 4

3

ほぼ常に機能する簡単な修正方法があります。表示を設定した後、フレームをサイズ変更できないようにします。したがって、この方法でコードを変更するだけです:

public static void main(String[] args) {

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    JFrame frame = new JFrame("Jedia");
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setSize(screenSize);
    frame.setVisible(true);    // FIRST visible = true
    frame.setResizable(false); // THEN  resizable = false
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

このようにして、フレームが最大化されて開始され、最大化ボタンがグレー表示され、ユーザーが使用できなくなります。(なぜこれをしなければならないのかはよくわかりません。最大化された状態は、ウィンドウが表示されたときにのみ実際に適用されると思います。以前にサイズを変更できないようにすると、適用されません。)

Windows 7 では、少なくともタイトル バーをクリックしてドラッグすることでウィンドウを最大化状態から外すことができるため、ほぼ常に機能します。ただし、以前に設定したサイズになります。問題は、ユーザーが再度最大化できないことです。リスナーでウィンドウを最大化された状態に戻す方法が見つかりませんでした。(編集: @David Kroukamp は、彼の回答の最後の部分で、ComponentListener を使用して最大化された状態を強制できることを示しています。したがって、この方法を使用する必要はありません。setResizable(false)ドラッグ アクションのため、Windows 7 にはまだ問題があります。何らかの理由でこのイベントによってキャッチされませんが、ユーザーは最大化されたボタンを使用して元の場所に戻すことができます)。

現在、この種のことを行う理由はほとんどありません。ユーザーがウィンドウを操作できないようにすると、ユーザーはあまり好きではありません (たとえば、最大化されたウィンドウは移動できず、複数の画面がある場合は煩わしい場合があります)。例外は、ゲームを作成している場合で、通常はフルスクリーンです。しかし、すべての装飾が必要なわけではなく、ウィンドウが必要なため、JFrame は必要ありません。

デフォルトのウィンドウ サイズが非常に小さいことが問題である場合、それは正常です。最初にフレームに何かを配置し (いくつかのコントロール、ボタン、アプリケーションに必要なもの)、レイアウトを使用して (これは重要です)、pack()フレームでメソッドを呼び出す必要があります。ウィンドウの適切なデフォルト サイズが選択されます。

最後に、最後の言葉。サンプル コードをショートカットとしてメソッドに入れましたが、main常に Swing EDT で Swing を使用する必要がありますSwingUtils.invokeLater()

于 2013-02-14T21:07:34.970 に答える
2

場合によっては、JFrameパラメータを設定する順序に注意する必要があります。

また、イベントディスパッチスレッドでSwingコンポーネントを使用する必要があります。

これを試して、役立つかどうかを確認してください。

public static void main(String[] args) {        
    final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame frame = new JFrame("Jedia");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(screenSize);
            frame.setResizable(false);
            frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            frame.setVisible(true);
        }   
    });
}
于 2013-02-14T19:52:28.700 に答える
0

どのような環境で実行していますか? Win7 で JDK1.6 / JDK1.7 を使用してこれを試したところ、期待どおりに動作しました (ウィンドウは最大化されて起動し、タスク バーに最小化されます)。

于 2013-02-14T19:39:22.917 に答える
0

うまくいくかもしれないハックがあります。このコードを試してください(私にとってはうまくいきました):

public static void main(String[] args) {

    final JFrame frame = new JFrame("Jedia");
    frame.setMinimumSize(new Dimension(600, 400));
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setVisible(true);

    frame.addComponentListener(new ComponentListener(){

        @Override
        public void componentHidden(ComponentEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void componentMoved(ComponentEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void componentResized(ComponentEvent e) {

            if (!e.paramString().startsWith("COMPONENT_RESIZED (-8,-8"))
            frame.setSize(new Dimension(600, 400));
        }

        @Override
        public void componentShown(ComponentEvent e) {
            // TODO Auto-generated method stub

        }
    }); 
}

e.paramString()復元アクションが行われると、「COMPONENT_RESIZED (-8,-8, [screensize])」のような文字列を返します。

于 2013-02-14T21:37:31.087 に答える