Вікно розгортання JFrame


89

Я складаю швидку і брудну анімацію за допомогою swing. Я хотів би, щоб вікно було максимально збільшеним. Як я можу це зробити?

Відповіді:


133

За умови, що ви розширюєте JFrame:

public void run() {
    MyFrame myFrame = new MyFrame();
    myFrame.setVisible(true);
    myFrame.setExtendedState(myFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
}

13
Поганою практикою є доступ до статичного поля через екземпляр. Використовуйте JFrame.MAXIMIZED_BOTHзамість цього.
nimcap

2
Величезна, масивна помилка та проблеми з вищезазначеним! (Ну добре, добре, незначні попередження без істотних наслідків ...) Має бути Frame.MAXIMIZED_BOTH, а не JFrame.MAXIMIZED_BOTH! :)
Manius

Чому ви спочатку називаєте setVisible (true)? Чи це суттєво? Він також чудово працює без (ubuntu).
AvrDragon

1
Без setVisible(true)першого розмір кадру має неправильний розмір. Я пробував це і до, і після setExtendedState(), і setVisible()повинен бути першим.
mjibson

2
@Crusader Насправді тут абсолютно ніякої проблеми, оскільки обидва посилаються на одне і те ж поле константи ( JFrameуспадковується від Frame).
Гійом Полет,

18

Щось на зразок 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);
    }
}

Для чого це |? Чи робить це одне, а якщо це не вдається, робить інше? Або ви вказуєте вибір програміста (тобто вибираєте одного з A | B для участі у цьому дзвінку?) Я раніше не бачив цього синтаксису.
Pureferret

@Pureferret - це оператор "побітове включення АБО", який копіює біт, якщо він існує в будь-якому з операндів. ( docs.oracle.com/javase/tutorial/java/nutsandbolts/… або tutorialspoint.com/java/java_basic_operators.htm )
VonC

14

Якщо ви використовуєте JFrame, спробуйте це

JFrame frame = new JFrame();
//...
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

мені подобається ця версія:

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

Я люблю цю версію. Дуже дякую.
SWIIWII

2

Спосіб встановити JFrame на повноекранний, це встановити MAXIMIZED_BOTHпараметр, який означає MAXIMIZED_VERT | MAXIMIZED_HORIZ, який відповідно встановлює кадр для максимізації по вертикалі та горизонталі

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

2

Я спробував рішення в цій темі та наведені тут , але просто дзвінок setExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH);відразу після виклику, setVisible(true);мабуть, не працює для мого середовища (Windows 10, JDK 1.8, моя панель завдань знаходиться в правій частині мого екрану). Роблячи це таким чином, все ще залишається крихітний простір ліворуч, праворуч і знизу.

Однак, що у мене спрацювало, це виклик, setExtendedState(...коли вікно активоване, наприклад:

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

1
У мене була подібна проблема в Windows 10 з панеллю завдань внизу екрана. Вікно було занадто високо, і тому панель завдань перекривала його. Ваше рішення спрацювало!
ЗручністьВізерунки

0

У підсумку я використав цей код:

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

Ці параметри працювали найкраще з усіх варіантів, включаючи підтримку декількох моніторів. Єдиним недоліком цього є те, що зміщення панелі завдань використовується на всіх моніторах у деяких конфігураціях.


0

Відповідь @kgiannakakis є повністю правильною, але якщо хтось застряг у цій проблемі і використовує Java 6 у Linux (наприклад, Mint 19 Cinnamon), стан MAXIMIZED_BOTH іноді не застосовується.

Ви можете спробувати викликати метод pack () після встановлення цього стану.

Приклад коду:

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

Це не потрібно, якщо ви використовуєте Java 7+ або Java 6 у Windows.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.