如何将扩展的jpanel添加到jframe

时间:2012-08-08 01:48:52

标签: java swing jframe jpanel

我写了一个扩展JPanel的类。 这是代码:

public class MedicalMonitorPanel extends JPanel{
    public MedicalMonitorPanel() {
        super();
        initComponents();
    }
    public void initComponents(){
        //layout settings
    }
}

现在我想将我的面板添加到jframe:

public class MedicalMonitorDisplay extends JFrame{
    MedicalMonitorPanel panel;

    public MedicalMonitorDisplay(){
    panel = new MedicalMonitorPanel();
    initComponents();
}
    private void initComponents(){
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
    getContentPane().add(panel);
    getContentPane().validate();
}
    public static void main(String[] args){
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            new MedicalMonitorDisplay().setVisible(true);
        }
    });
}
}

但我得到了这个例外:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at javax.swing.JFrame.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at MedicalMonitorDisplay.initComponents(MedicalMonitorDisplay.java:53)
    at MedicalMonitorDisplay.<init>(MedicalMonitorDisplay.java:40)
    at MedicalMonitorDisplay$1.run(MedicalMonitorDisplay.java:63)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)

报告add()方法有问题。怎么了?

2 个答案:

答案 0 :(得分:3)

这没有任何意义:

add(panel, getContentPane());

删除此行并重新开始。

相反,您应该通过以下方式将面板添加到contentPane:

getContentPane().add(panel);

如果这仍然不起作用,请告诉详细信息 - 如果您尝试这样做会出现什么问题?

此外,除非先将其强制转换为JPanel,否则无法在contentPane上调用revalidate。但是你不需要重新验证contentPane,因为你在添加所有组件之后会在JFrame上调用pack(),这就足够了。

答案 1 :(得分:2)

尝试使用SwingUtilities代替EventQueue

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new MedicalMonitorDisplay().setVisible(true);
        }
    });
}

我还会关注 Hovercraft Full Of Eels 建议修改您的代码,以panel的方式将JFrame添加到他指示的方式。


修改

问题是由于在使用MedicalMonitorPanel数组时MedicalMonitorPanel类缺少实例化而引起的。