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

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

基本上创建一个JFramesetExtendedState(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()方法JFrame。在MAXIMIZED_BOTHextendedState 集合上的frame 使用它来显示具体大小的frame 而不会闪烁。什么对我有用:

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

下面的代码对我有用。我使用了 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://docs.oracle.com/javase/7/docs/api/constant-values.html#java.awt.Frame

于 2017-08-23T06:38:05.180 回答