Java 我可以设置JFrame';最大化时的正常尺寸是多少?

Java 我可以设置JFrame';最大化时的正常尺寸是多少?,java,swing,Java,Swing,目标: 我想让一个框架在frame.MAXIMIZED\u这两种状态下都可见,但我也希望它有一个预定义的正常大小,这样当用户取消最大化时,框架将调整到我想要的大小。我希望帧首先显示为最大化,而不进行视觉调整。我希望帧保持最大化,直到用户取消最大化 到目前为止我尝试过的事情: 1) 评估:帧将切换到正常状态(不会保持最大化)=>不好 2) 评估:窗口(或仅其框架)将以500x500的大小显示,然后可视调整大小(最大值)=>不好。 原因是,如果某个帧不可见,则调用setExtendedState()

目标:

我想让一个框架在
frame.MAXIMIZED\u这两种状态下都可见,但我也希望它有一个预定义的正常大小,这样当用户取消最大化时,框架将调整到我想要的大小。我希望帧首先显示为最大化,而不进行视觉调整。我希望帧保持最大化,直到用户取消最大化

到目前为止我尝试过的事情:

1)

评估:帧将切换到正常状态(不会保持最大化)=>不好

2)

评估:窗口(或仅其框架)将以500x500的大小显示,然后可视调整大小(最大值)=>不好。 原因是,如果某个帧不可见,则调用
setExtendedState()
将延迟到该帧可见为止

3)

评估:就像在尝试#2中一样,框架的视觉大小=>不好

4) 我尝试将组件侦听器添加到框架覆盖
componentResize()
,并在那里更改状态。我还尝试添加一个窗口状态侦听器,覆盖
windowStateChange()
。我还尝试添加一个覆盖
windowOpened()
的窗口侦听器

评估:所有这些都导致了视觉调整,就像在尝试中一样#2=>不好

所以,如果我希望我的帧具有预定义的正常大小,但我希望它看起来最大化,我该怎么办


编辑:将整个问题编辑得更清楚,并添加了示例代码(SSCCE)。

对我来说,以下顺序有效

setSize(100,100);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);

我不知道你的意思,所以我举了一个例子来说明我认为你想要什么

基本上,使用
setExtendedState(JFrame.MAXIMIZED\u两者)
创建一个
JFrame
,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();
    }
}

您的#2尝试接近答案。在
JFrame
类中有
setMaximizedBounds()
方法。它由
MAXIMIZED\u tware
extendedState set上的frame使用,以显示具体尺寸的框架,而不会闪烁。对我有用的是:

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

calculateMaximizedBounds()
根据当前帧位置和大小,计算帧的最大化边界(谢谢,KO!)-如果您有2个以上的监视器,尤其是它们具有不同的尺寸,这一点很重要。

下面的代码适合我。我使用了Perzers的WindowEvent监听器思想,但我检查窗口状态是否从最大化更改而不是最小化(因此在恢复程序后,恢复以前的完整状态):

我不确定到底是什么状态

更新:在W10中使用JDK1.8——这里的状态实际上是“JFrame.ICONIFIED”,正如它应该的那样。 状态7实际上是不推荐使用的“重新调整光标大小”。

如果不发布SSCCE,没有任何想法,顺便说一句,JFrame.pack()执行以下操作same@mKorbel调用pack()的结果是相同的:我将看到一个我想要避免的可视窗口调整大小。您是否尝试让EDT睡眠一小段时间并直接调用您的调整大小?虽然可能不管用,但也许值得一试。丑陋的变通办法有时能解决丑陋的问题;)@Zhedar的问题是,我希望帧保持最大化。每当我调用setSize()时,帧将自动从最大化状态切换到正常状态。他说,他有一个可见的JFrame。你的不是。我在问题中写道,我试过这样做,这样做首先窗口(或者可能只是它的框架)将以你设置的大小显示(在你的示例中为100x100),然后它将被最大化。这是一个视觉调整,我想避免。我希望帧保持在最大化状态。我编辑了这个问题,这样事情就更清楚了。“我希望帧保持在最大化状态。”所以我猜您想删除用于演示帧正常大小的
计时器?删去那部分。如果我删去了那部分,那么你提出的解决方案已经在我的尝试中列出了。它有一个问题,我将看到一个视觉调整,我想避免。@icza在阅读您的评论等后,我想我理解。尽管在示例代码中有一个大问题是setSize,但绝对不推荐使用。我不在我的电脑旁,但就我所知,你想在创建时将jframe设置为最大化而不出现视觉闪烁吗?正如andrewthompson所说,只需拆下计时器。如果它仍然提供比我更直观的调整大小,t认为它可能停止。但我会确认何时,在我的pcYes附近,我希望在创建时将jframe最大化,但我也希望在用户手动取消最大化时将窗口调整到指定大小。如果省略setSize(),则不会发生这种情况。问题是我从一个最大化的帧开始。当我取消最大化它时,将调用您的侦听器,但是
getSize()
将返回宽度和高度都大于0的大小,因此不会调用
setSize()
。您可以测试它。此时调用getSize(),它将返回(0,0)。因为您调用frame.setExtendedState(frame.MAXIMIZED_两者),而不是实际调用setSize()。所以帧大小是(0,0),我做了测试。然后
getSize()
返回了一个
Dimension
,其分辨率接近我的屏幕分辨率。您是否调用过setSize()?不,我没有。我刚刚调用了
setExtendedState(MAXIMIZED_两者)
setVisible(true)
。无论是否包含
setMaximizedBounds()
,我都会得到相同的结果(除了当我包含
setMaximizedBounds()
时,最大化的大小显然就是我设置的大小)。你的意思是帧一直闪烁吗?是的,与无
setMaximizedBounds()
时相同。虽然#2是最接近我想要的,而且它甚至不麻烦。。。但我没有
setSize(100,100);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);
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();
    }
}
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);
                    }
                }
        }
    });
frame.setLocation(location);
frame.setSize( 500, 500 );
frame.setMaximizedBounds(calculateMaximizedBounds(frame))
frame.setExtendedState( Frame.MAXIMIZED_BOTH );
frame.setVisible( true );
    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);