JFrame на весь экран без отделки

Я использую Java8 на Windows-машине, разрабатываемой с использованием последней версии IntelliJ для сообщества. Чтобы сделать JFrame полноэкранным, я нахожу ниже решение, где я столкнулся с другим поведением, которое я хочу проверить.

Решение я взял из JFrame на весь экран

В соответствии с решением мне нужно поставить три строки ниже, чтобы сделать JFrame полноэкранным:

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

Но в моем проекте я создал класс AppFrame.java, который расширяет JFrame. И в конструкторе по умолчанию я установил некоторые базовые свойства, такие как шрифт и т. Д., И, что важно, видимость в true.

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

public class AppFrame extends JFrame {

    AppFrame() {
        Font baseFont = new Font("Dialog", Font.PLAIN, 12);
        setFont(baseFont);
        setLocationRelativeTo(null);
        setBackground(Color.WHITE);
        setForeground(Color.black);
        setLayout(new FlowLayout());
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

И в классе, который расширяет AppFrame, когда я пытаюсь поместить выше трех строк (с setVisible или без него, который уже идет из AppFrame), чтобы максимизировать его, получаем ошибку ниже:

Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)

Как часть решения (которое я хочу проверить) - Экспериментально я удалил setVisible (true) из AppFrame.java, и это сработало, но это повлияет на все классы, расширяющие AppFrame, поэтому я удалил frame.setUndecorated(true); а также из моего класса и положить обратно setVisible в AppFrame. И исключение прошло. Также frame.setUndecorated(true); Я считаю, удаляет строку заголовка JFrame.

Также ниже приводится выдержка из Javadoc JFrame:

Рамка может иметь свои собственные украшения (например, Frame и Titlebar), отключенные с помощью setUndecorated. Это можно сделать только тогда, когда кадр не отображается.

Было бы здорово, если бы кто-то мог проверить это поведение.

2 ответа

По замыслу вы должны призвать setUndecorated до и только до setVisible, Таким образом, у вас нет другого выбора, кроме как удалить из вызова базового класса setVisible и вызывать его каждый раз в детских классах.

Измените инициализатор, чтобы использовать параметры. AppFrame() { следует изменить на AppFrame(boolean undecorated, boolean visible) { потом в инициализатор добавь setUndecorated(undecorated); а также setVisible(visible);

Завершенное решение:

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

public class AppFrame extends JFrame {

    AppFrame(boolean undecorated, boolean visible) {
        Font baseFont = new Font("Dialog", Font.PLAIN, 12);
        setFont(baseFont);
        setLocationRelativeTo(null);
        setBackground(Color.WHITE);
        setForeground(Color.black);
        setLayout(new FlowLayout());
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setUndecorated(undecorated);
        setVisible(visible);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

В отношении:

Рамка может иметь свои собственные украшения (например, Frame и Titlebar), отключенные с помощью setUndecorated. Это можно сделать только тогда, когда кадр не отображается.

Это просто говорит о том, что вы должны сделать это перед звонком setVisible(true);, Чтобы определить, можете ли вы позвонить setUndecorated безопасно, вы можете использовать if (!isDisplayable()) { ... }

Другие вопросы по тегам