2016-09-04 2 views
0

У меня есть следующая структура моей программы: внешний класс MainWindow, внутренний класс LoginWindow и частный JFrame член z;Java Swing: Внутренний класс JFrame закрывает главное окно при закрытии

class MainWindow extends JFrame 
{ 
    private JFrame z;  

    class LoginWindow extends JFrame 
     {...} 
    public LoginWindow makeLogin() 
    { 
     return new LoginWindow(); 
    } 

    MainWindow() 
    { 
     ... 
     z=new JFrame(); 
     z.setVisible(true); 
    } 

} 

public class GUI 
{ 
    public static void main(String[] args) 
    { 
     MainWindow mainWindow=new MainWindow(); 
     mainWindow.setVisible(true); 

     MainWindow.LoginWindow loginWindow=mainWindow.makeLogin(); 
     loginWindow.setVisible(true); 

    } 

} 

Главный метод возвращает три окна. Когда я закрываю окно z, только z закрывается. Но когда я закрываю MainWindow/LoginWindow, все закрывается. Почему это происходит? Почему закрытие частного члена JFrame не закрывает MainWindow, закрывая его внутренний класс, объект закрывает все? Как я могу сделать так, чтобы закрытие LoginWindow не закрывало другие два (при закрытии MainWindow все еще закрывает все).

+1

Проверьте ответ camickr в [dup] (http://stackoverflow.com/questions/4268749/how-to-close-a-jframe-without-closing-the-main-program). –

ответ

2

Как сделать так, чтобы закрытие LoginWindow не закрывало другие два (при закрытии MainWindow все еще закрывается все).

LoginWindow не должен быть JFrame, а скорее модальным JDialog. Это не остановит поток событий Swing, когда он будет закрыт.

+0

Другие ответы предлагают располагать окно на закрытии. Что лучше использовать: 'DISPOSE_ON_CLOSE' для' JFrame LoginWindow' или 'JDialog'? – parsecer

+1

Лучше дать вашему графическому интерфейсу один JFrame, чтобы не нажимать окна на пользователя, если они не модальные диалоговые окна (например, экран входа в систему) или не открывают диалоговые окна (например, отдельное плавающее меню или панель инструментов). Лучше всего в запущенном приложении изменить вид JPanel через CardLayout. –

+0

Спасибо, я проверю! – parsecer