JFrame Maximize-Fenster

86

Ich stelle eine schnelle und schmutzige Animation mit Swing zusammen. Ich möchte, dass das Fenster maximiert wird. Wie kann ich das machen?

Nee
quelle

Antworten:

132

Vorausgesetzt, Sie erweitern JFrame:

public void run() {
    MyFrame myFrame = new MyFrame();
    myFrame.setVisible(true);
    myFrame.setExtendedState(myFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
}
kgiannakakis
quelle
13
Es ist eine schlechte Praxis, über eine Instanz auf statische Felder zuzugreifen. Verwenden Sie JFrame.MAXIMIZED_BOTHstattdessen.
Nimcap
2
Riesiger, massiver Fehler und Probleme mit den oben genannten! (Na gut, okay, kleine Warnungen ohne größere Konsequenzen ...) Sollte Frame.MAXIMIZED_BOTH sein, nicht JFrame.MAXIMIZED_BOTH! :)
Manius
Warum rufst du zuerst setVisible (true) auf? Ist es wichtig? Es funktioniert auch gut ohne (Ubuntu).
AvrDragon
1
Ohne setVisible(true)vorher ist der Rahmen nicht richtig dimensioniert. Ich habe es vorher und nachher setExtendedState()versucht und setVisible()muss der Erste sein.
Mjibson
2
@Crusader Hier absolut kein Problem, da beide auf dasselbe konstante Feld verweisen ( JFrameerbt von Frame).
Guillaume Polet
18

Etwas wie this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);

import java.awt.*;
import javax.swing.*;

public class Test extends JFrame
{
    public Test()
    {
        GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
        this.setMaximizedBounds(env.getMaximumWindowBounds());
        this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
    }

    public static void main(String[] args)
    {
        JFrame.setDefaultLookAndFeelDecorated(true);

        Test t = new Test();
        t.setVisible(true);
    }
}
VonC
quelle
Wofür ist das |? Tut es das eine und wenn das fehlschlägt, macht es das andere? Oder geben Sie die Wahl des Programmierers an (dh wählen Sie eine der Optionen A | B für diesen Aufruf aus?). Ich habe diese Syntax noch nie gesehen.
Pureferret
@Pureferret ist der Operator "bitweise inklusive ODER", der ein Bit kopiert, wenn es in einem der Operanden vorhanden ist. ( docs.oracle.com/javase/tutorial/java/nutsandbolts/… oder tutorialspoint.com/java/java_basic_operators.htm )
VonC
13

Wenn Sie einen JFrame verwenden, versuchen Sie dies

JFrame frame = new JFrame();
//...
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
user54579
quelle
2

Ich mag diese Version:

import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Toolkit;
import javax.swing.JFrame;

public class Test
{
    public static void main(String [] args)
    {
        final JFrame frame = new JFrame();
        final GraphicsConfiguration config = frame.getGraphicsConfiguration();

        final int left = Toolkit.getDefaultToolkit().getScreenInsets(config).left;
        final int right = Toolkit.getDefaultToolkit().getScreenInsets(config).right;
        final int top = Toolkit.getDefaultToolkit().getScreenInsets(config).top;
        final int bottom = Toolkit.getDefaultToolkit().getScreenInsets(config).bottom;

        final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        final int width = screenSize.width - left - right;
        final int height = screenSize.height - top - bottom;

        frame.setResizable(false);
        frame.setSize(width,height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
        frame.setVisible(true);
    }
}
frame_max_show
quelle
Ich liebe diese Version. Ich danke dir sehr.
SWIIWII
2

Um JFrame auf Vollbild einzustellen, müssen Sie die MAXIMIZED_BOTHOption festlegen , für MAXIMIZED_VERT | MAXIMIZED_HORIZdie der Frame jeweils so eingestellt ist, dass er vertikal und horizontal maximiert wird

package Example;
import java.awt.GraphicsConfiguration;
import javax.swing.JFrame;
import javax.swing.JButton;

public class JFrameExample
{
    static JFrame frame;
    static GraphicsConfiguration gc;
    public static void main(String[] args)
    {
        frame = new JFrame(gc);
        frame.setTitle("Full Screen Example");
        frame.setExtendedState(MAXIMIZED_BOTH);

        JButton button = new JButton("exit");
        b.addActionListener(new ActionListener(){@Override
        public void actionPerformed(ActionEvent arg0){
            JFrameExample.frame.dispose();
            System.exit(0);
        }});

        frame.add(button);
        frame.setVisible(true);
    }
}
Greg Reynolds
quelle
2

Ich habe die Lösungen in diesem und den hier aufgeführten Threads ausprobiert , aber ein einfacher Anruf setExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH);direkt nach dem Aufruf setVisible(true);funktioniert anscheinend nicht für meine Umgebung (Windows 10, JDK 1.8, meine Taskleiste befindet sich auf der rechten Seite meines Bildschirms). Wenn Sie dies auf diese Weise tun, bleibt links, rechts und unten immer noch ein winziger Raum.

Was für mich jedoch funktioniert hat, ist das Aufrufen, setExtendedState(...wenn das Fenster aktiviert ist, wie folgt:

public class SomeFrame extends JFrame {

    public SomeFrame() {
        // ...
        setVisible(true);
        setResizable(true);
        // if you are calling setSize() for fallback size, do that here
        addWindowListener (
            new WindowAdapter() {
                private boolean shown = false;
                @Override
                public void windowActivated(WindowEvent we) {
                    if(shown) return;
                    shown = true;
                    setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
                }
            }
        );
    }
}
TT.
quelle
1
Ich hatte ein ähnliches Problem unter Windows 10 mit der Taskleiste am unteren Bildschirmrand. Das Fenster war zu hoch und wurde daher von der Taskleiste überlappt. Ihre Lösung hat funktioniert!
ConveniencePatterns
0

Am Ende habe ich diesen Code verwendet:

public void setMaximized(boolean maximized){
    if(maximized){
        DisplayMode mode = this.getGraphicsConfiguration().getDevice().getDisplayMode();
        Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(this.getGraphicsConfiguration());
        this.setMaximizedBounds(new Rectangle(
                mode.getWidth() - insets.right - insets.left, 
                mode.getHeight() - insets.top - insets.bottom
        ));
        this.setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH);
    }else{
        this.setExtendedState(JFrame.NORMAL);
    }
}

Diese Option funktionierte am besten von allen Optionen, einschließlich der Unterstützung mehrerer Monitore. Der einzige Fehler, den dies hat, ist, dass der Taskleistenversatz auf allen Monitoren in einigen Konfigurationen verwendet wird.

Wouter
quelle
0

Die Antwort von @kgiannakakis ist völlig korrekt, aber wenn jemand an diesem Problem festhält und Java 6 unter Linux verwendet (z. B. Mint 19 Cinnamon), wird der Status MAXIMIZED_BOTH manchmal nicht angewendet.

Sie können versuchen, die pack () -Methode aufzurufen , nachdem Sie diesen Status festgelegt haben.

Codebeispiel:

public MainFrame() {
    setContentPane(contentPanel); //some JPanel is here
    setPreferredSize(new Dimension(1200, 800));
    setMinimumSize(new Dimension(1200, 800));
    setSize(new Dimension(1200, 800));
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    pack();
}

Dies ist nicht erforderlich, wenn Sie Java 7+ oder Java 6 unter Windows verwenden.

Traumtänzer
quelle