我有一个名为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/

10-11 08:42