Java中全屏JFrame

134

我很快会做一个项目,其中需要使用全屏模式。

它将在窗口中绘制一些图形。如果我使用JFrame或类似的东西会比较方便。

我不知道屏幕的最终分辨率是多少。请告诉我图形是否会自动重新调整大小?

JFrame jf = new JFrame();
jf.setSize(1650,1080);
//make it fullscreen;
//now is everything is going to be rescaled so it looks like the original?
14个回答

243

添加:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true);
frame.setVisible(true);

在不使用装饰的情况下,将JFrame设置为全屏 - shaILU
请参见:https://stackoverflow.com/questions/62286865/intstream-iterate-function-with-filter#comment110160167_62286865 - user7780894
4
我完全不理解为什么这个被点赞了。这是错误的做法,甚至在某些Linux版本上也无法正常工作。它并不是全屏,而是一个没有装饰的最大化窗口(这不是同一件事!)。正确答案是Paul Vargas的答案,而不是这个。 - Kelvin Bouma
1
这个答案描述了所谓的“窗口全屏”模式。Paul Vargas的答案描述了“独占全屏”模式。根据情况,两者都可以很有用。 - Slav
当用户有两个显示器时,这种解决方案实际上比Paul的解决方案更好用。例如,我想制作一个小工具,在辅助显示器上显示主显示器的副本,并带有一些叠加信息。在Windows上,使用Paul的解决方案会导致只有在您切换到Java应用程序时才能看到副本,使第一个显示器及其上的所有内容无法使用。当单击主显示器上的文本字段时,屏幕会短暂变黑,Java应用程序消失并停止显示叠加信息,直到您再次切换到它,而此解决方案可以正常工作。 - Nico Wawrzyniak

52

如果您想将您的框架置于全屏模式(如电影在全屏中),请查看这些答案。

java.awt.GraphicsEnvironmentjava.awt.GraphicsDevice用于将应用程序置于单个屏幕(设备)的全屏模式中。

例如:

static GraphicsDevice device = GraphicsEnvironment
        .getLocalGraphicsEnvironment().getScreenDevices()[0];

public static void main(String[] args) {

    final JFrame frame = new JFrame("Display Mode");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setUndecorated(true);

    JButton btn1 = new JButton("Full-Screen");
    btn1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            device.setFullScreenWindow(frame);
        }
    });
    JButton btn2 = new JButton("Normal");
    btn2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            device.setFullScreenWindow(null);
        }
    });

    JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    panel.add(btn1);
    panel.add(btn2);
    frame.add(panel);

    frame.pack();
    frame.setVisible(true);

}

1
这种方法存在问题;在我的家用电脑上配有独立显示器时,它可以完美运行,但是在我的工作办公室里,我的电脑是一体机,它只会让最大化的窗口填满整个屏幕。 - Blue Dev

14

8
一种方法是使用扩展状态。这会请求底层操作系统最大化JFrame窗口。
setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

另一种方法是手动最大化屏幕以满足您的需求。
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
setLocationRelativeTo(null);

但是在Ubuntu操作系统中存在一些缺陷。我发现的解决方法是这样的。
if (SystemHelper.isUnix()) {
    getContentPane().setPreferredSize(
    Toolkit.getDefaultToolkit().getScreenSize());
    pack();
    setResizable(false);
    show();

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Point p = new Point(0, 0);
            SwingUtilities.convertPointToScreen(p, getContentPane());
            Point l = getLocation();
            l.x -= p.x;
            l.y -= p.y;
            setLocation(p);
        }
    });
}

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
setLocationRelativeTo(null);

在 Fedora 中,上述问题不存在。但是涉及到 GnomeKDE 会有一些复杂的情况。所以最好要小心。希望这可以帮助到你。

7

最简单的修复方法:

for ( Window w : Window.getWindows() ) {
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow( w );
}

5
只需使用以下代码:
import java.awt.event.*;
import javax.swing.*;

public class FullscreenJFrame extends JFrame {
    private JPanel contentPane = new JPanel();
    private JButton fullscreenButton = new JButton("Fullscreen Mode");
    private boolean Am_I_In_FullScreen = false;
    private int PrevX, PrevY, PrevWidth, PrevHeight;

    public static void main(String[] args) {
        FullscreenJFrame frame = new FullscreenJFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);
        frame.setVisible(true);
    }

    public FullscreenJFrame() {
        super("My FullscreenJFrame");

        setContentPane(contentPane);

        // From Here starts the trick
        FullScreenEffect effect = new FullScreenEffect();

        fullscreenButton.addActionListener(effect);

        contentPane.add(fullscreenButton);
        fullscreenButton.setVisible(true);
    }

    private class FullScreenEffect implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (Am_I_In_FullScreen == false) {
                PrevX = getX();
                PrevY = getY();
                PrevWidth = getWidth();
                PrevHeight = getHeight();

                // Destroys the whole JFrame but keeps organized every Component
                // Needed if you want to use Undecorated JFrame dispose() is the
                // reason that this trick doesn't work with videos.
                dispose();
                setUndecorated(true);

                setBounds(0, 0, getToolkit().getScreenSize().width,
                        getToolkit().getScreenSize().height);
                setVisible(true);
                Am_I_In_FullScreen = true;
            } else {
                setVisible(true);
                setBounds(PrevX, PrevY, PrevWidth, PrevHeight);
                dispose();
                setUndecorated(false);
                setVisible(true);
                Am_I_In_FullScreen = false;
            }
        }
    }
}

我希望这能有所帮助。

哎呀,不行。1,请不要回复整个类的大块代码,而没有任何解释。2,不要在变量名中使用下划线,只需使用驼峰命名法表示变量和帕斯卡命名法表示类。 - Blue Dev

3
您只需要这个:
JFrame frame = new JFrame();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

当您使用MAXIMIZED_BOTH修饰符时,它将最大化窗口的所有内容(高度和宽度)。

有些人建议使用以下内容:

frame.setUndecorated(true);

我不建议这样做,因为您的窗口将没有标题栏,因此无法关闭/恢复/最小化。

2

首先,你需要使用的分辨率是1650,1080

现在添加:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

如果您在JFrame上的组件出现问题,那么在使用frame.add(component)方法添加所有组件后,请添加以下语句。
frame.pack();

2
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));

这只是让框架的大小与屏幕相同。原始答案翻译成“最初的回答”。

2

这将帮助您使用对象而不是框架

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

会将窗口最大化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接