我有一个名为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方法会导致问题?
我确定在调用该方法之前,所有面板/组件均已初始化,这很明显,因为代码确实在我重命名该方法之后才起作用。
最佳答案
这是JFrame类的代码片段,实际上是在构造函数中进行不推荐的可重写方法的调用,结果是在创建类之前以及域初始化之前就执行了覆盖的版本,并且无法初始化它们您的字段在超级构造函数完成工作之前”,因此您几乎没有选择,要么避免在被覆盖的方法中引用您的子类字段,要么通过创建新方法来完成所需的工作
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();
}
关于java - 重写JFrame.setBackground()时遇到麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38574105/