Problema na hora de fechar JFrame secundário

Galera mais uma vez venho pedir ajuda de vocês. É o seguinte, criei um botão que tem como função fechar o Jframe secundário.
Explicando melhor:
Criei um button ( nome do button bNao) que tem que fechar o meu Jframe (aviso) secundário sem fechar o meu principal, só que quando eu clico nele me gera um erro.

Código:

import javax.swing.JFrame;

public class GUIAviso extends javax.swing.JFrame {
JFrame Aviso;

    public GUIAviso() {
        initComponents();
    }
//... continuação do código
 private void taAvisoAncestorAdded(javax.swing.event.AncestorEvent evt) {                                      
            spAviso.setBorder(null);
    }                                     
//código do button bNao
    private void bNaoMouseClicked(java.awt.event.MouseEvent evt) {                                  
     bNao.addActionListener(new java.awt.event.ActionListener() {
                 public void actionPerformed(java.awt.event.ActionEvent e) {
                    Aviso.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                 }
             });
    }             

Obs.: Peguei esse código de um tópico que tem aqui no site.

Erro gerado:
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at supermercado.gui.GUIAviso$3.actionPerformed(GUIAviso.java:96)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Se alguém souber solucionar esse problema ou tiver um outro código que tenha a mesma função e puder postar eu agradeço.

Tente trocar o JFrame por um JDialog.

O JFrame é um recurso caro, use o menos possível.

bzy, não entendi. Sou novato no Java, não entendo muita coisa.

Galera consegui resolver o problema de fechar o JFrame, só que eu preciso dar 2 clicks no botão para ele fechar. Alguém sabe como resolver isso?
Obs.: troquei o Jframe por JDialog. Poderia ser esse o problema de ter que dar 2 clicks ou não tem nada a ver?

código é o seguinte:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDialog;

/*
 * @author David
 */
public class GUIAviso extends javax.swing.JDialog {

JDialog Aviso;
    public GUIAviso() {
        initComponents();
    }

//...

private void bNaoMouseClicked(java.awt.event.MouseEvent evt) {                                  
        bNao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
    }

Se alguém souber como resolver por favor me ajude.

Este código está adicionando o Action Listener quando há um evento mouseClicked no botão. Por isso que você está tendo que clicar duas vezes.

Coloque o código que adiciona o ActionListener para ser executado com o construtor:

public GUIAviso() { initComponents(); bNao.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); } }); }Você também pode colocar o código no método initComponents(), em vez de jogar direto no construtor, que será executado da mesma forma.

Ou então, se você quiser adicionar direto pelo NetBeans, ao invés de selecionar “mouseClicked” selecione “actionPerformed”. Dentro dele chame o método dispose(). Deve ficar algo do tipo:

private void bNaoActionPerformed(java.awt.event.ActionEvent evt) { //Coloque o método dispose. dispose(); }
Bom, acho que são estas as opções.

Falou…

1 curtida

Eric Yuzo , muito obrigado cara. Deu certo. Tanto colocar o código no construtor ou usar o dispose() no actionPerformed do button.

Tópico encerrado.
Vlw