全屏Java中的JFrame

Yod*_*oda 97 java fullscreen

我很快就会做一个项目,我将不得不使用全屏模式.

它将在窗口中绘制一些图形.如果我使用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?
Run Code Online (Sandbox Code Playgroud)

Rei*_*eus 194

加:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true);
frame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

  • 同样``frame.setUndecorated(true);`将使它真正全屏. (48认同)
  • 我完全不明白为什么这会被投票。这是错误的方法,甚至在某些版本的 Linux 上无法正常工作。它不是全屏的,它是一个没有装饰的最大化窗口(这不是一回事!)。正确答案是 Paul Vargas 的答案,而不是这个。 (4认同)

Pau*_*gas 34

如果您想将帧放在全屏模式下(如全屏电影),请检查这些答案.

的类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);

}
Run Code Online (Sandbox Code Playgroud)


Cha*_*han 6

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

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
Run Code Online (Sandbox Code Playgroud)

其他方法是根据您的要求手动最大化屏幕.

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
    setLocationRelativeTo(null);
Run Code Online (Sandbox Code Playgroud)

但这在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);
Run Code Online (Sandbox Code Playgroud)

在Fedora中,上述问题不存在.但是GnomeKDE存在并发症.所以最好小心点.希望这可以帮助.


小智 6

有史以来最简单的修复:

for ( Window w : Window.getWindows() ) {
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow( w );
}
Run Code Online (Sandbox Code Playgroud)


PeG*_*nOS 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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • @endian请不要改变人们的代码.如果您觉得需要更改某些内容,请在此处发表评论,PeGiannOS可以查看.如果他们不想改变它,你可以随时提供一个新的答案,如果你觉得它很重要. (3认同)

小智 5

你只需要这个:

JFrame frame = new JFrame();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

当您使用 MAXIMIZED_BOTH 修饰符时,它将一直最大化整个窗口(高度和宽度)。

有些人建议使用这个:

frame.setUndecorated(true);
Run Code Online (Sandbox Code Playgroud)

我不会推荐它,因为你的窗口没有标题,因此没有关闭/恢复/最小化按钮。