2016-04-20 3 views
-1

У меня есть 2 кадров/окно, я кнопка Выхода в окне 2, то из окна 1 запускает окно 2, а затем выйти из него т.е. setVisible(false);Как закрыть JFrame панели или окно

Когда я исполняю окно 2 я могу легко нажмите кнопку выхода и скройте текущее окно, однако, когда я запускаю окно 2 из окна 1, а затем нажмите кнопку выхода, я получаю NullPointerException Ошибка. то я создал экземпляр в начале со статикой, и эта ошибка исчезла, однако окно 2 не закрывается/скрывается, все еще там, без эффекта кнопки.

Окно 1 Код:

package com.my.jlms; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JButton; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class LibrarianMenu extends JFrame { 

private JPanel contentPane; 
private static LibrarianMenu frame; 


/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       frame = new LibrarianMenu(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public LibrarianMenu() { 
    setTitle("Librarian"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 385, 230); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    JButton btnPasswd = new JButton("Change Pass"); 
    btnPasswd.setBounds(202, 76, 146, 39); 
    contentPane.add(btnPasswd); 


    btnPasswd.addActionListener(
      new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        ChangePwd framee = new ChangePwd(); 
        framee.setVisible(true); 
       } 
      }); 

} 

} 

Окно 2 Код:

package com.my.jlms; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 

import javax.swing.JButton; 

public class ChangePwd extends JFrame { 

private JPanel contentPane; 
private static ChangePwd frame = new ChangePwd();; 

private JButton btnExit; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       frame = new ChangePwd(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public ChangePwd() { 
    setResizable(false); 
    setTitle("Password!"); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setBounds(100, 100, 266, 154); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    btnExit = new JButton("Exit"); 
    btnExit.setBounds(20, 80, 89, 30); 
    contentPane.add(btnExit); 


    btnExit.addActionListener(
      new ActionListener() { 
       public void actionPerformed(ActionEvent ae) { 
        frame.setVisible(false); 
       } 
      }); 
} 

}

Есть ли решение, которое я могу установить окно 2, чтобы скрыть?

+0

Возможный дубликат [Закрытие JFrame с кнопкой] (http://stackoverflow.com/questions/36739800/closing-jframe-with-button) – Berger

+0

Похоже, вы ответили «Спасибо, решила!» по дублированной теме, час назад .. – Berger

+1

У вас есть много экземпляров JFrames, которые происходят в этом втором окне, статически и из основного метода, а также из Window1. Избавьтесь от всего этого и просто используйте setVisible (true) вместо frame.setVisible (true). Вам вообще не нужна эта ссылка на фрейм. – ManoDestra

ответ

1

Проблема заключается в том, что вы создаете свой кадр, как свой класс, а не на объекте frame, но скрываете рамку, которая представляет объект frame.

Изменение этой линии (в actionPerformed() методе вашего ActionListener в):

frame.setVisible(false); 

к:

setVisible(false); 
0

Если вы хотите, чтобы закрыть JFrame, вы можете использовать метод dispose().

Пример:

public void actionPerformer(ActionEvent e) 
{ 
    if(e.getSource().equals(closeFrameButton) 
    { 
     dispose(); //This will close the current JFrame 
     } 
} 

Примечание: это отличается от System.exit(0);. С его помощью будет закрыта виртуальная машина Java. если вы просто хотите закрыть рамку, используйте dispose()

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