Java-Swing-Hauptfenster JFrame: warum muss SwingUtilities.getAncestorOfClass null zurück?

Ich implementieren möchten, eine Swing-Applikation, die hält alle seine JComponents innerhalb des Haupt-Anwendungsfensters JFrame. Wie es scheint, klobig prozeduralen code zu geben, alle meine JPanel-Konstruktoren einen parameter verweisen auf das JFrame. So einige der Forschung aufgedeckt SwingUtilities.getAncestorOfClass, die aussah wie die Lösung. Aber ich kann nicht verstehen, warum es null zurückgibt, wenn ich versuche, es zu benutzen, bekommen eine Referenz auf das JFrame in mein JPanel code.

Um Ihnen eine Idee geben, hier ist der code für das Haupt-JFrame, das schafft auch ein ViewPanel und plonks, die in das JFrame:

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class SDA {
    public static void main (String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                SDAMainViewPanel sdaMainViewPanel = new SDAMainViewPanel();
                JFrame frame = new JFrame("SDApp");
                frame.setSize(400, 400);
                frame.setContentPane(sdaMainViewPanel);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                    
                frame.setLocationRelativeTo(null);                
                frame.setVisible(true);
            }
        });
    }
}

Hier ist mein code für die ViewPanel, die, wenn Sie drücken Sie die Schaltfläche "Try Me" führt zu einer NullPointerException, da der Aufruf von SwingUtilities.getAncestorOfClass für die ViewPanel ist eine null nennen.

import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

public class SDAMainViewPanel extends JPanel {

    public SDAMainViewPanel() {
        initComponents();
    }

    private void initComponents() {
        getAncClass = new JButton("Try me");
        //This is null even though there IS an Ancestor JFrame!?!?
        final JFrame parent = (JFrame)SwingUtilities.getAncestorOfClass(JFrame.class, this);
        getAncClass.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {                
                parent.getContentPane().removeAll();
            }
        });
        add(getAncClass);
    }

    private JButton getAncClass;
}

Dank im Voraus, wenn Sie können, helfen Sie mit diese Frage.

InformationsquelleAutor Arvanem | 2010-09-09
Schreibe einen Kommentar