重写JFrame.setBackground()时出现问题

时间:2016-07-25 17:34:52

标签: java swing nullpointerexception

我有一个名为MainUI的类,它扩展了JFrame,它有以下代码:

//Constructor
public MainUI(){

// components/panels are already defined and initialized here.

setBackground(Color.decode("#EFF4E4"));
}

@Override
public void setBackground(Color colorbg){ //a method to set the same background color for all the components I ave

getContentPane().setBackground(colorbg);

decisionPanel.setBackground(colorbg);

adbRadio.setBackground(colorbg);
fastbootRadio.setBackground(colorbg);
commandRadio.setBackground(colorbg);

pushPanel.setBackground(colorbg);
uninstallPanel.setBackground(colorbg);
pcPanel.setBackground(colorbg);
phonePanel.setBackground(colorbg);
}

但是,当我编译时,它会在行[decisionPanel.setBackground(colorbg);中给出一个NullPointerException; ]

我尝试不重写setBackground方法并重命名它并且代码工作正常,我不知道为什么覆盖setBackground方法会导致问题?

我确定在调用方法之前已初始化所有面板/组件,这很明显,因为代码确实工作,我已经重命名了方法。

1 个答案:

答案 0 :(得分:2)

这是来自JFrame类的代码片段,它实际上是对构造函数中的overridable方法进行了未经推荐的调用,会发生在您的类被创建之前执行被覆盖的版本"并且在您的字段初始化之前在超级构造函数完成其工作之前,他们无法初始化你的字段。所以你几乎没有选择避免在重写方法中引用你的子类字段,或者通过制作新方法来做你想做的事情来做你做的事情

public JFrame(String title, GraphicsConfiguration gc) {
        super(title, gc);
        frameInit();
    }

    /** Called by the constructors to init the <code>JFrame</code> properly. */
    protected void frameInit() {
        enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
        setLocale( JComponent.getDefaultLocale() );
        setRootPane(createRootPane());
        setBackground(UIManager.getColor("control"));
        setRootPaneCheckingEnabled(true);
        if (JFrame.isDefaultLookAndFeelDecorated()) {
            boolean supportsWindowDecorations =
            UIManager.getLookAndFeel().getSupportsWindowDecorations();
            if (supportsWindowDecorations) {
                setUndecorated(true);
                getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
            }
        }
        sun.awt.SunToolkit.checkAndSetPolicy(this);
    }

或者您可以覆盖frameInit()

@Override
    protected void frameInit() {
        //initialize your fields here 
        super.frameInit();
    }