Ciao!
Ho un problema con la chiusura di una finestra.
Vi spiego: ho una finestra FinestraPrincipale dalla quale apro FinestraCliente, che a sua volta apre o FinestraSocieta o FinestraDitta.
Entrambe aprono FinestraDomanda che può anche creare una nuova FinestraCliente.

Ora, ogni volta che apro una nuova finestra, chiudo quella che l'ha creata! Il problema è proprio questo: la prima volta che apro FinestraCliente dal menù di FinestraPrincipale si chiude normalmente quando apre o FinestraSocieta o FinestraDitta. Quando invece la riapro da FinestraDomanda, non si chiude e il programma mi lancia questa eccezione:

codice:
xception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at PannelloCliente.actionPerformed(PannelloCliente.java:127)
    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.Component.processMouseEvent(Component.java:6038)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
    at java.awt.Component.processEvent(Component.java:5803)
    at java.awt.Container.processEvent(Container.java:2058)
    at java.awt.Component.dispatchEventImpl(Component.java:4410)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
    at java.awt.Container.dispatchEventImpl(Container.java:2102)
    at java.awt.Window.dispatchEventImpl(Window.java:2429)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
codice:
public class PannelloCliente extends JPanel implements ActionListener {
    
    private ButtonGroup bg;
    private JRadioButton rb[];
    private JButton b;
    private JTextField testo;
    private ListNode CLIENTI;
    private FinestraSocieta RIFE;
    private FinestraDitta RIFER;
    private FinestraCliente fin;
  
    
        /** Metodo costruttore senza parametri: istanzia la
         *  ListNode CLIENTI.
         */
        public PannelloCliente(FinestraCliente fin) {
        super();
        
        this.fin = fin;
        CLIENTI = new ListNode();
        
        setBackground(new Color(24,153,240));
        
        testo = new JTextField("Ditta individuale o società?");
        
        testo.setEditable(false);
        
        rb = new JRadioButton[2];
        rb[0] = new JRadioButton("Ditta Individuale");
        rb[1] = new JRadioButton("Società");
        
        
        bg = new ButtonGroup();
        bg.add(rb[0]);
        bg.add(rb[1]);
        
        b = new JButton("Avanti");
        b.addActionListener(this);
        
        setLayout(new GridLayout(4,1));
        
        add(testo);
        add(rb[0]);
        add(rb[1]);
        add(b);
        
        }
        
        /** Costruttore che accetta come parametro la lista CLIENTI
         *  precedentemente istanziata; in questo modo la lista viene
         *  aggiornata.
         */
        public PannelloCliente(ListNode CLIENTI, FinestraCliente chia) {
        super();
        
   
        this.CLIENTI = CLIENTI;
        fin = chia;
        
        setBackground(new Color(24,153,240));
        
        testo = new JTextField("Ditta individuale o società?");
        
        testo.setEditable(false);
        
        rb = new JRadioButton[2];
        rb[0] = new JRadioButton("Ditta Individuale");
        rb[1] = new JRadioButton("Società");
        
        
        bg = new ButtonGroup();
        bg.add(rb[0]);
        bg.add(rb[1]);
        
        b = new JButton("Avanti");
        b.addActionListener(this);
        
        setLayout(new GridLayout(4,1));
        
        add(testo);
        add(rb[0]);
        add(rb[1]);
        add(b);
        
        }
        
        /** Metodo per gestire eventi JButton. */
        public void actionPerformed(ActionEvent e) {
            
                if (rb[0].isSelected()) {
                    /** Creo FinestraDitta passandole come parametri un riferimento
                     *  alla lista CLIENTI, e un riferimento alla finestra stessa.
                     *  Infine nascondo FinestraCliente.
                     */
                    FinestraDitta f = new FinestraDitta("Inserisci/Rimuovi cliente");
                    Container cont = f.getContentPane();
                    RIFER = f;
                    PanDitta p = new PanDitta(this.CLIENTI, this.RIFER);
                    cont.add(p);
                    f.setVisible(true);
                    
                    fin.setVisible(false);
                }
                
                else {
                    /** Creo FinestraSocieta passandole come parametri un riferimento
                     *  alla lista CLIENTI, e un riferimento alla finestra stessa.
                     *  Infine nascondo FinestraCliente.
                     */
                    FinestraSocieta fs = new FinestraSocieta("Inserisci/Rimuovi cliente");
                    Container conts = fs.getContentPane();
                    RIFE = fs;
                    PanSocieta pan = new PanSocieta(this.CLIENTI, this.RIFE);
                    conts.add(pan);
                    fs.setVisible(true);
                    
                    fin.setVisible(false);
                }
                
            }
        
}
La riga 127 del pannello è quella in rosso.
Vi ringrazio anticipatamente se potete aiutarmi!