全屏Java中的JFrame


110

我将很快进行一个项目,并且必须在其中使用全屏模式。

它将在窗口中绘制一些图形。如果我使用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?

您需要定义“全屏”。除了以下答案外,您可能还想考虑是否应该装饰框架(包括标题栏和边框)。除非您执行自定义绘画,否则不会发生缩放。如果您使用的是常规的Swing组件和布局管理器,则应该发现布局会调整为新的屏幕分辨率。当然,您将需要对其进行测试;)
MadProgrammer,2012年

您要使用Lion Fullscreen吗?
LanguagesNamedAfterCofee

Answers:


206

加:

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

52
frame.setUndecorated(true);将使其真正全屏显示。
Yoda 2014年

如果您使用GNU / Linux,您可能需要设置DisplayMode.BIT_DEPTH_MULTIDisplayMode.REFRESH_RATE_UNKNOWN应用新的显示模式时。我没有用setExtendedState。测试了使用带有Java 8的Kubuntu 15.10的工作
。– code_dredd

我正在使用Java8,对我来说未修饰的引发异常,当我移除未修饰的代码时,代码工作正常,并且确实使全屏显示。
shaILU

我会告诉你错误和原因。我创建了一个AppFrame类(具有一些默认属性),为了使任何类都成为JFrame,我只是对其进行扩展。将setVisible设置为true。现在,以上三行必须具有相同的顺序,如果在ExtendedState之前可见,您将得到以下错误。当我纠正定单错误时,您得到的JFrame没有标题栏.........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

@shaILU通过一个最小的可复制示例
Reimeus

39

如果要将帧置于全屏模式(例如全屏电影),请检查以下答案。

这些类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);

}

@Paul Vargas:您甚至可以在未装饰的窗口上添加菜单栏。要退出,在您的示例中,您必须键入“ alt + F4”。
Cardman'1


7

一种方法是使用扩展状态。这要求底层操作系统最大化JFrame。

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

其他方法是根据需要手动最大化屏幕。

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

但这在Ubuntu OS中存在陷阱。我发现的工作就是这样。

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涉及一些并发症。所以最好小心点。希望这可以帮助。


6

最简单的修复:

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

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);和您的解决方案有什么区别?
尤达

您必须具有解决方案的框架。而对于我而言,您不需要,它将自动循环通过程序中的所有窗口
Ariel Terrani

做得好。此修补程序对macOS甚至更好,因为其他修补程序仍将保持菜单栏可见。此修复程序完全隐藏了所有内容。这应该是公认的答案。
Panayotis

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

我希望这有帮助。



2

首先,这是您要使用的分辨率1650,1080

现在添加:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

如果JFrame上的组件存在问题,则在使用frame.add(component)方法添加了所有组件之后,请添加以下语句。

frame.pack();

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

这只是使框架变成屏幕的大小



0

您只需要这样:

JFrame frame = new JFrame();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

当您使用MAXIMIZED_BOTH修改器时,它将在整个窗口中达到最大值(高度和宽度)。

建议使用以下方法:

frame.setUndecorated(true);

我不推荐这样做,因为您的窗口没有标题,因此没有关闭/还原/最小化按钮。


0

价值观强调我的意思是:

JFrame-属性


虽然图片可能暗中提供答案,但请尝试通过一些解释来详细说明您的答案。但是,恕我直言,由于您的答案实际上与现有答案相同,因此请仔细考虑您是否真的想详细说明并保留此答案。
Yohanes Khosiawan许先汉

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.