2016-07-25 2 views
0

У меня есть класс с именем MainUI, который расширяет JFrame, он имеет следующий код:проблемы в переопределение JFrame.setBackground()

//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); 
} 

однако, когда я компилирую, это дает NullPointerException на линии [decisionPanel.setBackground (colorbg); ]

Я попытался не переопределять метод setBackground и переименовал его, и код работал нормально, я не знаю, почему переопределение метода setBackground вызывает проблему?

Я уверен, что все панели/компоненты инициализированы перед вызовом метода, это очевидно, так как код действительно работал только после того, как я переименовал этот метод.

+0

Вы уверены, что решениеPanel правильно инициализировано при попытке установить BG? –

+0

Я не вижу, где вы создаете solutionPanel. – FredK

+0

Скорее всего потому, что setBackground вызывается при построении 'JFrame' (до вашего' // определения компонентов/панелей') – copeg

ответ

2

Это отладочный код из класса JFrame, который действительно выполняет необоснованный вызов переопределяемого метода из конструктора, что происходит, когда ваша переопределенная версия выполняется до создания вашего класса »и перед инициализацией ваших полей и их это не способ инициализировать ваши поля до того, как конструктор супер завершит свою работу », поэтому у вас есть несколько вариантов, чтобы не ссылаться на поля вашего подкласса в переопределенном методе/s или делать то, что вы сделали, создав новый метод для нужного вам материала.

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(); 
    } 
Смежные вопросы