JFrame最大化窗口


88

我正在使用Swing制作快速且肮脏的动画。我希望窗口最大化。我怎样才能做到这一点?

Answers:


133

前提是您要扩展JFrame:

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

13
通过实例访问静态字段是一种不好的做法。使用JFrame.MAXIMIZED_BOTH代替。
nimcap 2010年

2
巨大,大量的错误以及上述问题!(好吧,没什么大问题,没有重大警告...)应该是Frame.MAXIMIZED_BOTH而不是JFrame.MAXIMIZED_BOTH!:)
Manius

为什么首先调用setVisible(true)?重要吗?没有(ubuntu),它也可以正常工作。
AvrDragon 2012年

1
没有setVisible(true)第一,框架的大小将无法正确调整。我在之前和之后都尝试过setExtendedState(),而且setVisible()必须是第一个。
mjibson 2012年

2
@Crusader实际上绝对没有问题,因为它们都引用同一个常量字段(JFrame继承自Frame)。
Guillaume Polet

18

就像是 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

@Pureferret,它是“按位包含或”运算符,如果存在于任一操作数中,则将其复制一点。(docs.oracle.com/javase/tutorial/java/nutsandbolts/...tutorialspoint.com/java/java_basic_operators.htm
VonC

14

如果您使用的是JFrame,请尝试以下操作

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


2

我喜欢这个版本:

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);
    }
}

我喜欢这个版本。非常感谢。
SWIIWII

2

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

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);
    }
}

2

我已经在该线程和此处的线程中尝试过解决方案,但是仅在调用setExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH);后立即调用setVisible(true);显然对我的环境不起作用(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);
                }
            }
        );
    }
}

1
我在Windows 10上也遇到了类似的问题,任务栏位于屏幕底部。窗口太高,因此被任务栏覆盖。您的解决方案成功了!
ConveniencePatterns,

0

我最终使用了以下代码:

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);
    }
}

该选项在所有选项中都发挥了最佳作用,包括多显示器支持。唯一的缺陷是某些监视器上都使用了任务栏偏移量。


0

@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,则没有必要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.