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 中使用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 回答