我打算实现一个 Swing 应用程序,它将所有 JComponents 都保存在主应用程序窗口 JFrame 中。为我的所有 JPanel 构造函数提供一个引用 JFrame 的参数似乎是笨重的程序代码。因此,一些研究发现了 SwingUtilities.getAncestorOfClass,它看起来像是解决方案。但是我不明白为什么当我尝试使用它在我的 JPanel 代码中获取对 JFrame 的引用时它返回 null。
为了给你一个想法,这里是主 JFrame 的代码,它还创建了一个 ViewPanel 并在 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);
}
});
}
}
这是我的 ViewPanel 代码,当您按下“Try Me”按钮时,会导致 NullPointerException,因为对 ViewPanel 的 SwingUtilities.getAncestorOfClass 的调用是空调用。
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;
}
如果您能帮助解决这个问题,请提前致谢。