Okno JFrame Maximize

89

Tworzę szybką i brudną animację za pomocą swingu. Chciałbym, aby okno było zmaksymalizowane. Jak mogę to zrobić?

nie
źródło

Odpowiedzi:

133

Pod warunkiem, że rozszerzasz JFrame:

public void run() {
    MyFrame myFrame = new MyFrame();
    myFrame.setVisible(true);
    myFrame.setExtendedState(myFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
}
kgiannakakis
źródło
13
Dostęp do pola statycznego przez instancję jest złą praktyką. Użyj JFrame.MAXIMIZED_BOTHzamiast tego.
nimcap
2
Ogromny, masywny błąd i problemy z powyższym! (Cóż, w porządku, drobne ostrzeżenia bez większych konsekwencji ...) Powinno to być Frame.MAXIMIZED_BOTH, a nie JFrame.MAXIMIZED_BOTH! :)
Manius
Dlaczego najpierw wywołujesz metodę setVisible (true)? Czy to ma znaczenie? Działa również dobrze bez (ubuntu).
AvrDragon
1
Bez setVisible(true)wcześniejszej ramki rozmiar nie jest prawidłowy. Próbowałem tego zarówno przed, jak i po setExtendedState(), i setVisible()muszę być pierwszy.
mjibson
2
@Crusader Absolutnie nie ma tutaj problemu, ponieważ oba odnoszą się do tego samego stałego pola ( JFramedziedziczy po Frame).
Guillaume Polet
18

Coś jak 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
źródło
Do czego służy |? Czy robi jedno, a jeśli to zawiedzie, robi to drugie? A może wskazujesz wybór programisty (tj. Wybierz jednego z A | B do włączenia w tym wywołaniu?) Nie widziałem wcześniej tej składni.
Pureferret
@Pureferret jest to operator „bitowego LUB włącznie”, który kopiuje bit, jeśli istnieje w którymkolwiek operandzie. ( docs.oracle.com/javase/tutorial/java/nutsandbolts/… lub tutorialspoint.com/java/java_basic_operators.htm )
VonC,
14

Jeśli używasz JFrame, spróbuj tego

JFrame frame = new JFrame();
//...
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
user54579
źródło
2

podoba mi się ta wersja:

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
źródło
Uwielbiam tę wersję. Dziękuję bardzo.
SWIIWII
2

Sposobem na ustawienie JFrame na pełny ekran jest ustawienie MAXIMIZED_BOTHopcji, która oznacza MAXIMIZED_VERT | MAXIMIZED_HORIZ, czyli odpowiednio ustawia ramkę tak, aby zmaksymalizować w pionie i poziomie

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
źródło
2

Wypróbowałem rozwiązania w tym wątku i te tutaj , ale samo wywołanie setExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH);zaraz po wywołaniu setVisible(true);najwyraźniej nie działa w moim środowisku (Windows 10, JDK 1.8, mój pasek zadań znajduje się po prawej stronie ekranu). Robi to w ten sposób, nadal pozostawia niewielką przestrzeń po lewej, prawej i dole.

U mnie jednak zadziałało dzwonienie, setExtendedState(...gdy okno jest aktywowane, na przykład:

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.
źródło
1
Miałem podobny problem w systemie Windows 10 z paskiem zadań na dole ekranu. Okno było zbyt wysokie i dlatego nakładało się na pasek zadań. Twoje rozwiązanie zadziałało!
ConveniencePatterns
0

Skończyło się na tym, że użyłem tego kodu:

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

Ta opcja działała najlepiej ze wszystkich opcji, w tym obsługi wielu monitorów. Jedyną wadą jest to, że przesunięcie paska zadań jest używane na wszystkich monitorach, to niektóre konfiguracje.

Wouter
źródło
0

Odpowiedź @kgiannakakis jest w pełni poprawna, ale jeśli ktoś utknął w tym problemie i używa Java 6 w systemie Linux (na przykład Mint 19 Cinnamon), stan MAXIMIZED_BOTH czasami nie jest stosowany.

Możesz spróbować wywołać metodę pack () po ustawieniu tego stanu.

Przykład kodu:

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

Nie jest to konieczne, jeśli używasz Java 7+ lub Java 6 w systemie Windows.

Lunatyk
źródło