我可以在最大化时设置JFrame的正常大小吗?

时间:2012-12-17 10:51:05

标签: java swing

目标:

我希望在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)。

5 个答案:

答案 0 :(得分:3)

我不确定你的意思,所以我举了一个例子来展示我认为你想要的东西。

基本上使用JFrame创建setExtendedState(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();
    }
}

答案 1 :(得分:2)

对我来说,以下订单有效

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

答案 2 :(得分:1)

您在#2 尝试中接近回答。 setMaximizedBounds()课程中有JFrame方法。它由MAXIMIZED_BOTH extendedState集上的框架使用,以显示具体大小的框架而不会闪烁。什么对我有用:

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

calculateMaximizedBounds()计算帧的最大边界(谢谢,KO!),具体取决于当前帧的位置和大小 - 如果U有2个以上的监视器,这是非常重要的,特别是如果它们具有不同的维度。

答案 3 :(得分: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);
                    }
                }
        }
    });

答案 4 :(得分:0)

以下代码适合我。我使用了Perzers关于WindowEvent监听器的想法,但是我检查窗口状态是否从最大化改变了,但没有最小化(因此在恢复程序之后恢复完整的先前状态):

    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://github.com/tmikolov/word2vec/blob/20c129af10659f7c50e86e3be406df663beff438/word2vec.c#L80