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()) { ... }