JFrame in Java a schermo intero


110

Presto realizzerò un progetto e dovrò utilizzare la modalità a schermo intero.

Disegnerà alcuni grafici nella finestra. Sarebbe conveniente se utilizzo JFrame o qualcosa di simile.

Non so quale sarà la risoluzione finale dello schermo. Per favore dimmi se la grafica verrà automaticamente ridimensionata?

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?

È necessario definire "schermo intero". Insieme alle risposte seguenti, potresti prendere in considerazione se la cornice deve essere decorata o meno (ovvero includere la barra del titolo ei bordi). A meno che tu non stia eseguendo la pittura personalizzata, il ridimensionamento non verrà eseguito. Se stai usando normali componenti Swing e un gestore di layout, dovresti scoprire che il layout si adatta alla nuova risoluzione dello schermo. Ovviamente vorrai provarlo;)
MadProgrammer

Vuoi usare Lion Fullscreen?
LanguagesNamedAfterCofee

Risposte:


206

Inserisci:

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

52
Inoltre frame.setUndecorated(true);lo renderà veramente a schermo intero.
Yoda

Se stai usando GNU / Linux, potresti dover impostare DisplayMode.BIT_DEPTH_MULTIe DisplayMode.REFRESH_RATE_UNKNOWNquando applichi una nuova modalità di visualizzazione. Non ho dovuto usare setExtendedState. Testato funzionante usando Kubuntu 15.10 con Java 8.
code_dredd

Sto usando Java8, per me non decorato sta generando un'eccezione e quando ho rimosso non decorato, il codice funziona bene e ha anche reso il frame a schermo intero.
shaILU

Ti dirò l'errore e il motivo. Ho creato una classe AppFrame (con alcune proprietà predefinite) e per rendere qualsiasi classe come JFrame la estendo semplicemente. Ha setVisible come true. Ora le tre righe sopra devono essere nello stesso ordine, se visibile è prima di ExtendedState otterrai l'errore di seguito. Quando ho corretto l'errore dell'ordine e ottieni JFrame senza barra del titolo .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

@shaILU ha messo tutto questo in una nuova domanda con un esempio riproducibile minimo
Reimeus

39

Se vuoi mettere la cornice in modalità a schermo intero (come un film a schermo intero), controlla queste risposte.

Le classi java.awt.GraphicsEnvironmente java.awt.GraphicsDevicevengono utilizzate per mettere un'app in modalità a schermo intero su una schermata (il dispositivo).

per esempio:

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: puoi persino aggiungere una barra dei menu su una finestra non decorata. Per uscire, nel tuo esempio, devi digitare "alt + F4".
cardman


7

Un modo è usare lo stato esteso. Ciò chiede al sistema operativo sottostante di massimizzare il JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Un altro approccio potrebbe essere quello di massimizzare manualmente lo schermo per le tue esigenze.

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

Ma questo ha delle insidie ​​nel sistema operativo Ubuntu. Il lavoro che ho trovato è stato questo.

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

In Fedora il problema di cui sopra non è presente. Ma ci sono complicazioni coinvolte con Gnome o KDE . Quindi meglio stare attenti. Spero che questo ti aiuti.


6

La soluzione più semplice di sempre:

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

Qual è la differenza tra frame.setExtendedState(JFrame.MAXIMIZED_BOTH);e la tua soluzione?
Yoda

Devi avere una cornice per la tua soluzione. Mentre per il mio non lo fai e passerà automaticamente attraverso tutte le finestre nel programma
Ariel Terrani

Molto bene. Questa correzione funziona ancora meglio per macOS, poiché l'altra correzione manterrebbe comunque visibile la barra dei menu. Questa correzione nasconde totalmente tutto. Questa dovrebbe essere la risposta accettata.
Panayotis

5

Usa questo codice:

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

Spero che aiuti.


2

ti aiuterà a utilizzare l'istante dell'oggetto della cornice

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

Prima di tutto, questa è la risoluzione che vorresti usare 1650,1080,.

Ora aggiungi:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

In caso di problemi con i componenti su JFrame, dopo aver aggiunto tutti i componenti utilizzando il frame.add(component)metodo, aggiungere la seguente dichiarazione.

frame.pack();

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

Questo rende la cornice delle dimensioni dello schermo


1

Puoi usare lo strumento delle proprietà.
Imposta 2 proprietà per il tuo JFrame :

extendedState 6
resizeable    true

0

Hai solo bisogno di questo:

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

Quando si utilizza il modificatore MAXIMIZED_BOTH, si sposterà al massimo su tutta la finestra (altezza e larghezza).

Ci sono alcuni che hanno suggerito di usare questo:

frame.setUndecorated(true);

Non lo consiglio, perché la tua finestra non avrà un'intestazione, quindi nessun pulsante di chiusura / ripristino / riduzione a icona.


0

I valori hanno evidenziato che intendo:

JFrame - Proprietà


Sebbene l'immagine possa fornire una risposta implicita, prova anche a elaborare la tua risposta con qualche spiegazione. imho, tuttavia, poiché la tua risposta è effettivamente la stessa di quella esistente, per favore pensa attentamente se vuoi davvero elaborare e conservare questa risposta o meno.
Yohanes Khosiawan 许先汉

-1

Imposta 2 proprietà di seguito:

  1. extendedState = 6
  2. ridimensionabile = vero

Per me funziona.


2
Le statistiche finali esistono per un motivo.
Yoda

Hmmmm ... In netBeans 8.0.1 posso impostare JFrame per i valori delle proprietà "ridimensionabili" + "ridimensionabili" (finestre delle proprietà)
Rudi Wijaya
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.