8

ゴール:

フレームをFrame.MAXIMIZED_BOTH状態で表示したいのですが、ユーザーが最大化を解除すると、フレームが希望のサイズにサイズ変更されるように、事前定義された通常のサイズも必要です。そして、視覚的なサイズ変更なしで、フレームを最初に最大化して表示したい。そして、ユーザーが最大化を解除するまで、フレームを最大化したままにしておきます。

これまでに試したこと:

1)

frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );
frame.setSize( 500, 500 );

評価:フレームが通常の状態に切り替わる (最大化されたままにならない) => 良くない。

2)

frame.setSize( 500, 500 );
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );

評価:ウィンドウ (またはそのフレームのみ) が 500x500 のサイズで表示され、その後、視覚的なサイズ変更 (最大まで) が表示されます => 良くありません。これは、フレームが表示されない場合、フレームが表示されるまで呼び出しsetExtendedState()が延期されるためです。

3)

frame.setSize( 500, 500 );
frame.setVisible( true );
frame.setExtendedState( Frame.MAXIMIZED_BOTH );

評価:試行 #2 と同様に、フレームの視覚的なサイズ変更 => 良くありません。

4) フレームのオーバーライドにコンポーネント リスナーを追加し、そこで状態を変更しようとしましたcomponentResize()。また、ウィンドウ状態リスナーのオーバーライドを追加しようとしましたwindowStateChange()。また、ウィンドウリスナーのオーバーライドを追加しようとしましたwindowOpened()

評価:すべて試行 #2 と同じように視覚的なサイズ変更が行われました => 良くありません。

フレームを定義済みの標準サイズにしたいが、最大化して表示したい場合はどうすればよいでしょうか?

編集:質問全体をより明確に編集し、サンプルコード(SSCCE)を追加しました。

4

5 に答える 5

3

何を言っているのかわからないので、あなたが何を望んでいるかを示すために例を作りました。

基本的にJFramewithsetExtendedState(JFrame.MAXIMIZED_BOTH)を作成し、5000 ミリ秒後に状態をJFrame.NORMALちらつきなしに変更します。

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Test {

    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void initComponents() {
        final JFrame frame = new JFrame() {
            @Override
            public Dimension getPreferredSize() {//used for testing purposes so JFrame has a size
                return new Dimension(300, 300);
            }
        };
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

        new Timer(5000, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                frame.setExtendedState(JFrame.NORMAL);
            }
        }).start();
    }
}
于 2012-12-17T11:15:53.273 に答える
2

私にとっては、次の順序で機能します

setSize(100,100);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);
于 2012-12-17T11:01:58.830 に答える
1

あなたは2番目の試みでほぼ正解に近づきました。クラスにはsetMaximizedBounds()メソッドがあります。ちらつきのない具体的なサイズのフレームを表示するために設定された extendedStateJFrame上のフレームによって使用されます。MAXIMIZED_BOTH私のために働くもの:

frame.setLocation(location);
frame.setSize( 500, 500 );
frame.setMaximizedBounds(calculateMaximizedBounds(frame))
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );

calculateMaximizedBounds()現在のフレームの位置とサイズに応じて、フレームの最大化された境界を計算します (ありがとう、KO!)。U に 2 つ以上のモニターがある場合、特にサイズが異なる場合は重要です。

于 2014-12-15T17:11:34.560 に答える
0
this.addWindowStateListener(new WindowStateListener() {

        @Override
        public void windowStateChanged(WindowEvent e) {
                if (e.getNewState() == Frame.NORMAL) {
                    if (getSize().width == 0 || getSize().height == 0) {
                        setSize(500, 500);
                    }
                }
        }
    });
于 2014-08-13T04:47:52.127 に答える
0

以下のコードは私にとってはうまくいきます。WindowEventリスナーのPerzersのアイデアを使用しましたが、ウィンドウの状態が最大化から変更されたが最小化されていないかどうかを確認します(したがって、プログラムを復元した後、完全な以前の状態が回復されます):

    setExtendedState(JFrame.MAXIMIZED_BOTH);
    this.addWindowStateListener(new WindowStateListener() {
        @Override
        public void windowStateChanged(WindowEvent e) {
                // In Windows10 state 7 is returned if you minimize, usually ICONIFIED should mean the window is minimized, I used JDK1.6 on W10 (don't ask why)..
                if (e.getNewState() != JFrame.MAXIMIZED_BOTH && e.getNewState() != 7 && e.getNewState() != JFrame.ICONIFIED) {  
                    setSize(768, 500);
                }
        }
    });
    setVisible(true);

実際に状態7が何であるかはわかりません。

更新: W10 で JDK1.8 を使用 - ここでの状態は実際には「JFrame.ICONIFIED」です。状態 7 は実際には非推奨の「NE_RESIZE_CURSOR」です。 https://docs.oracle.com/javase/7/docs/api/constant-values.html#java.awt.Frame

于 2017-08-23T06:38:05.180 に答える