135 votes

JFrame en plein écran Java

Je vais bientôt faire un projet et je vais devoir utiliser mode plein écran dans celui-ci.

Il va dessiner quelques graphiques dans la fenêtre. Il serait plus pratique d'utiliser JFrame ou quelque chose de similaire.

Je ne sais pas quelle sera la résolution finale de l'écran. Veuillez me dire si les graphiques seront automatiquement redimensionnés ?

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?

0 votes

Vous devez définir "plein écran". En plus des réponses ci-dessous, vous pouvez considérer si le cadre doit être décoré ou non (c'est-à-dire inclure la barre de titre et les bordures). À moins que vous n'effectuiez une peinture personnalisée, le redimensionnement ne se produira pas. Si vous utilisez des composants Swing normaux et un gestionnaire de mise en page, vous devriez constater que la mise en page s'adapte à la nouvelle résolution de l'écran. Bien entendu, vous voudrez le tester ;)

0 votes

Voulez-vous utiliser Lion Fullscreen ?

245voto

Reimeus Points 93429

Ajouter :

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

57 votes

Aussi frame.setUndecorated(true); le rendra vraiment plein écran.

0 votes

Si vous utilisez GNU/Linux, vous pouvez avoir besoin de configurer DisplayMode.BIT_DEPTH_MULTI y DisplayMode.REFRESH_RATE_UNKNOWN lors de l'application d'un nouveau mode d'affichage. Je n'ai pas eu à utiliser setExtendedState . Testé en utilisant Kubuntu 15.10 avec Java 8.

0 votes

J'utilise Java8, pour moi undecorated jette une exception et quand j'ai enlevé undecorated, le code fonctionne bien et a fait le cadre plein écran aussi bien.

53voto

Paul Vargas Points 10652

Si vous voulez mettre votre cadre en mode plein écran (comme un film en plein écran), vérifiez ces réponses.

Les classes java.awt.GraphicsEnvironment y java.awt.GraphicsDevice sont utilisés pour mettre une application en mode plein écran sur un seul écran (le dispositif).

Par exemple :

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

}

0 votes

@Paul Vargas : Vous pouvez même ajouter une barre de menu sur une fenêtre non décorée. Pour quitter, dans votre exemple, vous devez taper "alt+F4".

14voto

Eng.Fouad Points 44085

Utilice setExtendedState(int state) où l'état serait JFrame.MAXIMIZED_BOTH .

9voto

Chan Points 1580

L'un des moyens consiste à utiliser l'État étendu. Cela demande au système d'exploitation sous-jacent de maximiser le JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Une autre approche serait de maximiser manuellement l'écran selon vos besoins.

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

Mais cela présente des écueils dans le système d'exploitation Ubuntu. La solution que j'ai trouvée est la suivante.

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

Dans Fedora, le problème ci-dessus n'existe pas. Mais il y a des complications liées à Gnome ou KDE . Il faut donc être prudent. J'espère que cela vous aidera.

5voto

PeGiannOS Points 100

Il suffit d'utiliser ce code :

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

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X