2009-02-21 2 views
7

У меня есть небольшая рамка, где я спрашиваю пользователя & пароль. Этот кадр будет открыт, щелкнув по кнопке в главном окне.java swing закрыть окно без выхода app

Тогда у меня есть две кнопки: ok и отмена.

Когда я нажимаю кнопку «отменить», мне нужно закрыть этот кадр, не выходя из приложения.

Как я могу это сделать?

ответ

18

Вы можете использовать Frame.hide() или Frame.dispose(). Я также рекомендовал бы изучить JDialog или JOptionPane

Исправление: hide() устарело. SetVisible (false) следует использовать вместо

+0

ОК, и что делать, если мой обработчик кликов находится в другом классе extarnal для фрейма? – Giancarlo

+0

вы должны передать ссылку на фрейм обработчику кликов (в конструкторе) – TofuBeer

3

Вы можете вызвать setVisible (false) на фрейме.

Возможно, вы также захотите вызвать setDefaultCloseOperation на кадре, проходящем в HIDE_ON_CLOSE (информация здесь: http://java.sun.com/javase/6/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation%28int%29). Это предотвратит уклонение приложения, если пользователь нажимает «X» на JFrame, чтобы закрыть его.

2

Убедитесь, что вы не так:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
+0

это не моя проблема приятель :) – Giancarlo

1

Сделать функцию внешнего класса, где вы реализуете JFrame (вы должны закрыть по нажатию кнопки отмены).
Напишите this.setVisible(false); в реализации этой функции.
Наконец, вызовите эту функцию в реализации ActionListener, когда вы хотите ее закрыть.

3

Может быть уборщиком способ просто изменить setDefaultCloseOperation от EXIT_ON_CLOSE к DISPOSE_ON_CLOSE:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
3

Использование this.dispose(); в методе слушателя действия, когда имя пользователя/пароль успешно. например:

public void actionPerformed(ActionEvent ae) { 

    if(ae.getSource()=="button you press to confirm username/password"){ 
     if(userNameTf.getText().equals(username)&&isPassword(passwordTf.getPassword())){ 
      new "window to be opened upon success" 
      this.dispose(); // calls dispose on this object ie. 
              // the login window 
     } 
     else{ 
      userNameTf.setText(""); 
      passwordTf.setText(""); 

      JOptionPane.showMessageDialog(this, 
        "Username and/or password is incorrect!", 
        "Attention!", 
        JOptionPane.WARNING_MESSAGE); 
     } 
    } 

} 

Если вы используете внутренние классы для обработки событий просто заменить 'this.dispose()' с Super_Class_Name.this.dispose();

1

Вы можете сделать это во многих отношениях, но эти два способа наиболее полезной один
1. написать this.setVisible(false) во внутрь реализуется ActionListener
Или
2. запись this.dispose() внутри реализованный ActionListener. Надеюсь, это вам поможет.

+0

Это именно то, что говорит принятый ответ. Нет причин добавлять ответ, чтобы повторить то, что уже принято. –

2

setVisible метод не освобождает ресурсы памяти и должен использоваться только тогда, когда форма должна использоваться снова.

Метод dispose Освобождает все ресурсы экрана, используемые этим окном, его подкомпонентами и всеми его собственными детьми.То есть ресурсы для этих Компонентов будут уничтожены, любая память, которую они потребляют, будет возвращена ОС, и они будут отмечены как не отображаемые.

Смежные вопросы