JFrame не скрывается, если setVisible(false)
Вопрос
import javax.swing.*;
class Frame extends JFrame{
Frame() {
JFrame j = new JFrame();
j.setBounds(100, 200, 120, 120);
j.setTitle("null");
j.setVisible(true);
j.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
public class test001 {
public static void main (String Args[]){
Frame f = new Frame();
System.out.print("Visible = True");
f.setVisible(false);
System.out.print("Visible = false");
}
}
после команды setVisible(false).Окно JFrame все еще отображается на моем рабочем столе.Как я могу это исправить?
Решение
Ты создаешь еще один JFrame
внутри вашего конструктора.Предполагая, что то, что вы хотите, является вашим Frame
чтобы стать невидимым, сделайте следующее:
class Frame extends JFrame {
Frame() {
setBounds(100, 200, 120, 120);
setTitle("null");
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
public class test001 {
public static void main(String Args[]) {
Frame f = new Frame();
System.out.print("Visible = True");
f.setVisible(false);
System.out.print("Visible = false");
}
}
Другие советы
Проблема в том, что ваш основной метод использует другой JFrame, чем ваш конструктор.Ваш конструктор Frame создает новый экземпляр JFrame (используя новый JFrame).Когда вы вызываете f.setVisible(false), он переходит к вашему фрейму, а не к созданному JFrame.
Проблема здесь в том, что ваш класс «Frame» создает экземпляр нового JFrame.Вызов setVisible в Frame не влияет на отображаемый JFrame.
Вы можете исправить это, просто используя экземпляр JFrame или просто создав подкласс.Не делайте и то, и другое.
Помимо двух разных кадров, о которых вы говорите (это проблема, на которую ответили https://stackoverflow.com/a/1450488/1326149), вам следует выполнять все графические операции в потоке EVT (поскольку ваша программа, даже если она отлично работает для вас, может быть непереносима на разные платформы).