JFrame最大化窗口

Posted

技术标签:

【中文标题】JFrame最大化窗口【英文标题】:JFrame Maximize window 【发布时间】:2010-10-03 12:46:15 【问题描述】:

我正在使用 swing 制作一个快速而肮脏的动画。我希望窗口最大化。我该怎么做?

【问题讨论】:

【参考方案1】:

如果你使用的是 JFrame,试试这个

JFrame frame = new JFrame();
//...
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

【讨论】:

【参考方案2】:

JFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)怎么样?

【讨论】:

【参考方案3】:

类似this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);

import java.awt.*;
import javax.swing.*;

public class Test extends JFrame

    public Test()
    
        GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
        this.setMaximizedBounds(env.getMaximumWindowBounds());
        this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
    

    public static void main(String[] args)
    
        JFrame.setDefaultLookAndFeelDecorated(true);

        Test t = new Test();
        t.setVisible(true);
    

【讨论】:

| 是干什么用的?它会做一个吗,如果失败了,它会做另一个吗?或者您是在表示程序员的选择(即在此调用中选择 A|B 之一?)我以前从未见过这种语法。 @Pureferret 它是“按位包含或”运算符,如果它存在于任一操作数中,则复制一个位。 (docs.oracle.com/javase/tutorial/java/nutsandbolts/… 或 tutorialspoint.com/java/java_basic_operators.htm)【参考方案4】:

设置JFrame全屏的方法是设置MAXIMIZED_BOTH选项,代表MAXIMIZED_VERT | MAXIMIZED_HORIZ,分别设置frame垂直和水平最大化

package Example;
import java.awt.GraphicsConfiguration;
import javax.swing.JFrame;
import javax.swing.JButton;

public class JFrameExample

    static JFrame frame;
    static GraphicsConfiguration gc;
    public static void main(String[] args)
    
        frame = new JFrame(gc);
        frame.setTitle("Full Screen Example");
        frame.setExtendedState(MAXIMIZED_BOTH);

        JButton button = new JButton("exit");
        b.addActionListener(new ActionListener()@Override
        public void actionPerformed(ActionEvent arg0)
            JFrameExample.frame.dispose();
            System.exit(0);
        );

        frame.add(button);
        frame.setVisible(true);
    

【讨论】:

【参考方案5】:

前提是你要扩展 JFrame:

public void run() 
    MyFrame myFrame = new MyFrame();
    myFrame.setVisible(true);
    myFrame.setExtendedState(myFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);

【讨论】:

通过实例访问静态字段是一种不好的做法。请改用JFrame.MAXIMIZED_BOTH 巨大、巨大的错误和上述问题! (好吧,好吧,没有重大后果的轻微警告......)应该是 Frame.MAXIMIZED_BOTH 而不是 JFrame.MAXIMIZED_BOTH! :) 为什么要先调用setVisible(true)?意义重大吗?没有(ubuntu)它也可以正常工作。 如果没有 setVisible(true) 首先,框架的大小不正确。我在setExtendedState()前后都试过了,setVisible()一定是第一个。 @Crusader 实际上这里绝对没有问题,因为两者都引用同一个常量字段(JFrame 继承自 Frame)。【参考方案6】:

我喜欢这个版本:

import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Toolkit;
import javax.swing.JFrame;

public class Test

    public static void main(String [] args)
    
        final JFrame frame = new JFrame();
        final GraphicsConfiguration config = frame.getGraphicsConfiguration();

        final int left = Toolkit.getDefaultToolkit().getScreenInsets(config).left;
        final int right = Toolkit.getDefaultToolkit().getScreenInsets(config).right;
        final int top = Toolkit.getDefaultToolkit().getScreenInsets(config).top;
        final int bottom = Toolkit.getDefaultToolkit().getScreenInsets(config).bottom;

        final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        final int width = screenSize.width - left - right;
        final int height = screenSize.height - top - bottom;

        frame.setResizable(false);
        frame.setSize(width,height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
        frame.setVisible(true);
    

【讨论】:

我喜欢这个版本。非常感谢。【参考方案7】:

我最终使用了这段代码:

public void setMaximized(boolean maximized)
    if(maximized)
        DisplayMode mode = this.getGraphicsConfiguration().getDevice().getDisplayMode();
        Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(this.getGraphicsConfiguration());
        this.setMaximizedBounds(new Rectangle(
                mode.getWidth() - insets.right - insets.left, 
                mode.getHeight() - insets.top - insets.bottom
        ));
        this.setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH);
    else
        this.setExtendedState(JFrame.NORMAL);
    

此选项是所有选项中效果最好的,包括多显示器支持。唯一的缺陷是所有显示器都使用任务栏偏移量是一些配置。

【讨论】:

【参考方案8】:

我已经尝试了这个线程和here 中的解决方案,但是在调用setVisible(true); 之后立即调用setExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH); 显然不适用于我的环境(Windows 10、JDK 1.8,我的任务栏位于我屏幕的右侧)。这样做仍然会在左侧、右侧和底部留下一个很小的空间。

然而,对我有用的是,当窗口被激活时调用setExtendedState(...,如下所示:

public class SomeFrame extends JFrame 

    public SomeFrame() 
        // ...
        setVisible(true);
        setResizable(true);
        // if you are calling setSize() for fallback size, do that here
        addWindowListener (
            new WindowAdapter() 
                private boolean shown = false;
                @Override
                public void windowActivated(WindowEvent we) 
                    if(shown) return;
                    shown = true;
                    setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
                
            
        );
    

【讨论】:

我在 Windows 10 上遇到了类似的问题,屏幕底部的任务栏。窗口太高,因此与任务栏重叠。您的解决方案奏效了!【参考方案9】:

@kgiannakakis 的答案是完全正确的,但如果有人遇到这个问题并在 Linux 上使用 Java 6(例如 Mint 19 Cinnamon),MAXIMIZED_BOTH 状态有时不适用。

您可以尝试在设置此状态后调用pack() 方法。

代码示例:

public MainFrame() 
    setContentPane(contentPanel); //some JPanel is here
    setPreferredSize(new Dimension(1200, 800));
    setMinimumSize(new Dimension(1200, 800));
    setSize(new Dimension(1200, 800));
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    pack();

如果您在 Windows 上使用 Java 7+ 或 Java 6,则无需这样做。

【讨论】:

以上是关于JFrame最大化窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何从JFrame中仅删除“最大化”按钮?

如何从 JFrame 中仅删除最大化按钮?

如何通过代码最大化 JFrame?

十. 图形界面(GUI)设计2.框架窗口

java中jframe 和jpanel的区别

如何让 JFrame 没有任务栏按钮?