JFrame en Java plein écran


110

Je vais bientôt faire un projet et je devrai utiliser le mode plein écran.

Il dessinera quelques graphiques dans la fenêtre. Ce serait pratique si j'utilise 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?

Vous devez définir "plein écran". En plus des réponses ci-dessous, vous voudrez peut-être déterminer si le cadre doit être décoré ou non (c'est-à-dire inclure la barre de titre et les bordures). Sauf si vous effectuez 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'ajuste à la nouvelle résolution d'écran. Bien sûr, vous voudrez le tester;)
MadProgrammer

Voulez-vous utiliser Lion Fullscreen?
LanguagesNamedAfterCofee

Réponses:


206

Ajouter:

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

52
En outre , frame.setUndecorated(true);il sera vraiment plein écran.
Yoda

Si vous utilisez GNU / Linux, vous devrez peut-être définir DisplayMode.BIT_DEPTH_MULTIet DisplayMode.REFRESH_RATE_UNKNOWNlors 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.
code_dredd

J'utilise Java8, pour moi non décoré, c'est une exception et lorsque j'ai supprimé non décoré, le code fonctionne bien et a également créé un cadre en plein écran.
shaILU

Je vais vous dire l'erreur et la raison. J'ai créé une classe AppFrame (avec quelques propriétés par défaut) et afin de créer n'importe quelle classe en tant que JFrame, je l'étend simplement. Il a définiVisible comme vrai. Maintenant au-dessus de trois lignes doit être dans le même ordre, si visible est avant ExtendedState, vous obtiendrez une erreur ci-dessous. Lorsque j'ai corrigé une erreur de commande et que vous obtenez JFrame sans barre de titre .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

@shaILU a mis tout cela dans une nouvelle question avec un exemple minimal reproductible
Reimeus

39

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

Les classes java.awt.GraphicsEnvironmentet java.awt.GraphicsDevicesont utilisées 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);

}

@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".
cardman


7

Une façon 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 a des pièges dans Ubuntu OS. Le travail autour que j'ai trouvé était le suivant.

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'est pas présent. Mais il y a des complications impliquées avec Gnome ou KDE . Alors mieux vaut être prudent. J'espère que cela t'aides.


6

Solution la plus simple jamais réalisée:

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

Quelle est la différence entre frame.setExtendedState(JFrame.MAXIMIZED_BOTH);votre solution et votre solution?
Yoda

Vous devez avoir un cadre pour votre solution. Alors que pour le mien, vous ne le faites pas et il passera automatiquement en boucle à travers toutes les fenêtres du programme
Ariel Terrani

Bien joué. Ce correctif fonctionne encore mieux pour macOS, car l'autre correctif garderait toujours la barre de menus visible. Ce correctif cache totalement tout. Cela devrait être la réponse acceptée.
Panayotis

5

Utilisez simplement 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 ça aide.


2

cela vous aidera à utiliser votre objet instantanément du cadre

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

Tout d'abord, c'est la résolution que vous voudriez utiliser 1650,1080,.

Ajoutez maintenant:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Si vous rencontrez des problèmes avec les composants du JFrame, après avoir ajouté tous les composants à l'aide de la frame.add(component)méthode, ajoutez l'instruction suivante.

frame.pack();

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

Cela fait juste le cadre de la taille de l'écran


1

Vous pouvez utiliser l'outil de propriétés.
Définissez 2 propriétés pour votre JFrame :

extendedState 6
resizeable    true

0

Vous n'avez besoin que de ceci:

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

Lorsque vous utilisez le modificateur MAXIMIZED_BOTH, il maximisera tout le long de la fenêtre (hauteur et largeur).

Certains suggèrent d'utiliser ceci:

frame.setUndecorated(true);

Je ne le recommanderai pas, car votre fenêtre n'aura pas d'en-tête, donc pas de bouton fermer / restaurer / réduire.


0

Les valeurs ont souligné que je veux dire:

JFrame - Propriétés


bien que l'image puisse fournir une réponse implicitement, essayez également d'élaborer votre réponse avec quelques explications. à mon humble avis, cependant, puisque votre réponse est en fait la même que celle existante, veuillez réfléchir attentivement si vous voulez vraiment élaborer et conserver cette réponse ou non.
Yohanes Khosiawan 许先汉

-1

Définissez 2 propriétés ci-dessous:

  1. ExtendedState = 6
  2. redimensionnable = vrai

Ça marche pour moi.


2
La statique finale est là pour une raison.
Yoda

Hmmmm ... Dans netBeans 8.0.1, je peux définir JFrame pour les valeurs de propriétés "redimensionnables" + "redimensionnables" (fenêtres de propriétés)
Rudi Wijaya
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.