我有一个名为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方法会导致问题?
我确定在调用方法之前已初始化所有面板/组件,这很明显,因为代码确实工作,我已经重命名了方法。
答案 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();
}