JFrame im Vollbild-Java

110

Ich werde bald ein Projekt durchführen und muss den Vollbildmodus verwenden.

Es werden einige Grafiken in das Fenster gezeichnet. Es wäre praktisch, wenn ich JFrame oder ähnliches verwenden würde.

Ich weiß nicht, wie die endgültige Auflösung des Bildschirms aussehen wird. Bitte sagen Sie mir, ob die Grafiken automatisch neu skaliert werden.

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?
Yoda
quelle
Sie müssen "Vollbild" definieren. Zusammen mit den folgenden Antworten möchten Sie möglicherweise überlegen, ob der Rahmen dekoriert werden soll oder nicht (dh die Titelleiste und die Ränder). Wenn Sie kein benutzerdefiniertes Malen durchführen, erfolgt keine Neuskalierung. Wenn Sie normale Swing-Komponenten und Layout-Manager verwenden, sollten Sie feststellen, dass sich das Layout an die neue Bildschirmauflösung anpasst. Natürlich wirst du es testen wollen;)
MadProgrammer
Möchten Sie Lion Fullscreen verwenden?
LanguagesNamedAfterCofee

Antworten:

206

Hinzufügen:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true);
frame.setVisible(true);
Reimeus
quelle
52
Auch frame.setUndecorated(true);wird es wirklich Vollbild machen.
Yoda
Wenn Sie GNU / Linux verwenden, müssen Sie möglicherweise einen neuen Anzeigemodus festlegen DisplayMode.BIT_DEPTH_MULTIund DisplayMode.REFRESH_RATE_UNKNOWNanwenden. Ich musste nicht benutzen setExtendedState. Getestet mit Kubuntu 15.10 mit Java 8.
code_dredd
Ich verwende Java8, für mich löst undecorated eine Ausnahme aus, und wenn ich undecorated entfernt habe, funktioniert der Code einwandfrei und hat den Frame auch im Vollbildmodus erstellt.
ShaILU
Ich werde Ihnen den Fehler und den Grund mitteilen. Ich habe eine AppFrame-Klasse erstellt (mit einigen Standardeigenschaften) und um eine Klasse als JFrame zu erstellen, habe ich sie einfach erweitert. Es hatVisible als wahr gesetzt. Jetzt müssen die obigen drei Zeilen in derselben Reihenfolge sein. Wenn sie vor ExtendedState angezeigt werden, wird der folgende Fehler angezeigt. Wenn ich den Bestellfehler korrigiert habe und du JFrame ohne Titelleiste Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
bekommst
@shaILU stellte all das in eine neue Frage mit einem minimal reproduzierbaren Beispiel
Reimeus
39

Wenn Sie Ihren Frame in den Vollbildmodus versetzen möchten (wie einen Film im Vollbildmodus), überprüfen Sie diese Antworten.

Die Klassen java.awt.GraphicsEnvironmentund java.awt.GraphicsDevicewerden verwendet, um eine App auf einem Bildschirm (dem Dispositiv) in den Vollbildmodus zu versetzen.

z.B:

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
quelle
@Paul Vargas: Sie können sogar eine Menüleiste in einem nicht dekorierten Fenster hinzufügen. Zum Beenden müssen Sie in Ihrem Beispiel "alt + F4" eingeben.
Cardman
7

Eine Möglichkeit besteht darin, den erweiterten Status zu verwenden. Dadurch wird das zugrunde liegende Betriebssystem aufgefordert, den JFrame zu maximieren.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Ein anderer Ansatz wäre, den Bildschirm manuell für Ihre Anforderungen zu maximieren.

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

Dies hat jedoch Fallstricke in Ubuntu OS. Die Arbeit, die ich fand, war diese.

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 ist das obige Problem nicht vorhanden. Es gibt jedoch Komplikationen bei Gnome oder KDE . Also sei besser vorsichtig. Hoffe das hilft.

Chan
quelle
6

Einfachste Lösung aller Zeiten:

for ( Window w : Window.getWindows() ) {
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow( w );
}
Ariel Terrani
quelle
Was ist der Unterschied zwischen frame.setExtendedState(JFrame.MAXIMIZED_BOTH);Ihrer Lösung?
Yoda
Sie müssen einen Rahmen für Ihre Lösung haben. Während für mich nicht und es wird automatisch alle Fenster im Programm durchlaufen
Ariel Terrani
Gut gemacht. Dieser Fix funktioniert unter macOS noch besser, da der andere Fix die Menüleiste weiterhin sichtbar hält. Dieser Fix verbirgt alles total. Dies sollte die akzeptierte Antwort sein.
Panayotis
5

Verwenden Sie einfach diesen 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;
            }
        }
    }
}

Ich hoffe das hilft.

PeGiannOS
quelle
2

Es wird Ihnen helfen, Ihr Objekt sofort im Rahmen zu verwenden

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

Jerin Stephen
quelle
2

Zuallererst ist dies die Auflösung, die Sie verwenden möchten 1650,1080.

Fügen Sie nun hinzu:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Wenn Sie Probleme mit den Komponenten im JFrame haben frame.add(component), fügen Sie die folgende Anweisung hinzu, nachdem Sie alle Komponenten mithilfe der Methode hinzugefügt haben .

frame.pack();
Saad K.
quelle
1
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));

Dadurch hat der Rahmen nur die Größe des Bildschirms

Schlau
quelle
1

Sie können das Eigenschaften-Tool verwenden. Legen
Sie 2 Eigenschaften für Ihren JFrame fest :

extendedState 6
resizeable    true
Burhan Yaprak
quelle
0

Sie brauchen nur das:

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

Wenn Sie den Modifikator MAXIMIZED_BOTH verwenden, wird er maximal über das Fenster verteilt (Höhe und Breite).

Es gibt einige, die dies vorschlagen:

frame.setUndecorated(true);

Ich werde es nicht empfehlen, da Ihr Fenster keine Kopfzeile hat, also keine Schaltfläche zum Schließen / Wiederherstellen / Minimieren.

Kyon Perez
quelle
0

Hervorgehobene Werte, die ich meine:

JFrame - Eigenschaften

Rudi Wijaya
quelle
Während das Bild möglicherweise implizit eine Antwort liefert, versuchen Sie bitte, Ihre Antwort mit einer Erklärung zu erläutern. Imho, da Ihre Antwort tatsächlich dieselbe ist wie die vorhandene, überlegen Sie bitte sorgfältig, ob Sie diese Antwort wirklich ausarbeiten und beibehalten möchten oder nicht.
Yohanes Khosiawan 许先汉
-1

Stellen Sie 2 Eigenschaften unten ein:

  1. ExtendedState = 6
  2. Größe ändern = wahr

Für mich geht das.

Rudi Wijaya
quelle
2
Die endgültige Statik gibt es aus einem Grund.
Yoda
Hmmmm ... In netBeans 8.0.1 kann ich JFrame für Werte von "resizeable" + "resizeable" -Eigenschaften (Eigenschaftenfenster) festlegen
Rudi Wijaya