2015-10-20 4 views
1

У меня есть три класса TestGUI, MainFrame и ReportsJPanel. Объект MainFrame передается как параметр в конструкторе ReportJPanel. Когда я пытаюсь вызвать метод getter объекта MainFrame, который был передан, и получить значение частной переменной, из объекта ReportsJPanel я получаю ошибку NullPointerException. Ошибка в этой строке в ReportJPanel instalationLocation = mainFrame.getInstalationLocation();NullPointerException при вызове метода геттер

Код для TestGUI:

package testgui; 

public class TestGUI { 

    public static void main(String[] args) { 

     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(RiskManagerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(RiskManagerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(RiskManagerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(RiskManagerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 

       MainFrame mainFrame = new MainFrame(); 
       mainFrame.initComponents(); 
       mainFrame.setVisible(true); 
      } 
     }); 
    } 

} 

Код для MainFrame:

package testgui; 

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import left_panel_package.ReportsJPanel; 

public class MainFrame extends JFrame{ 

    private String instalationLocation; 

    public MainFrame(){ 
     setInstalationLocation("TEST_Location"); 
    } 

    public void initComponents() { 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setTitle("TEST"); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BorderLayout()); 
     mainPanel.setBackground(new Color(0, 0, 0)); 

     JPanel leftPanel = new JPanel(); 
     leftPanel.setBackground(new Color(255, 0, 0)); 
     leftPanel.setPreferredSize(new Dimension(200,100)); 
     leftPanel.setLayout(new GridLayout(3,0)); 

     JPanel rightPanel = new JPanel(); 
     rightPanel.setBackground(new Color(0, 255, 0)); 
     rightPanel.setPreferredSize(new Dimension(200,100)); 

     JPanel centerPanel = new JPanel(); 
     centerPanel.setBackground(new Color(0, 0, 255)); 

     JPanel toolBar = new JPanel(); 
     toolBar.setBackground(new Color(0, 255, 255)); 
     toolBar.setPreferredSize(new Dimension(100,100)); 

     ReportsJPanel reportsPanel = new ReportsJPanel(this); 
     reportsPanel.initComponents(); 

     leftPanel.add(reportsPanel); 

     mainPanel.add(leftPanel, BorderLayout.WEST); 
     mainPanel.add(rightPanel, BorderLayout.EAST); 
     mainPanel.add(centerPanel, BorderLayout.CENTER); 
     mainPanel.add(toolBar, BorderLayout.NORTH); 

     setContentPane(mainPanel); 

     GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
     int width = gd.getDisplayMode().getWidth(); 
     int height = gd.getDisplayMode().getHeight(); 
     setSize(width, height); 
     setLocationRelativeTo(null); 
    } 

    public String getInstalationLocation() { 
     return instalationLocation; 
    } 

    private void setInstalationLocation(String instalationLocation) { 
     this.instalationLocation = instalationLocation; 
    } 

} 

Код для ReportsJPanel:

import javax.swing.JPanel; 
import javax.swing.border.TitledBorder; 
import testgui.MainFrame; 

public class ReportsJPanel extends JPanel{ 

    private MainFrame mainFrame; 
    private String instalationLocation; 

    public ReportsJPanel (MainFrame mainframe){ 

     this.mainFrame=mainFrame; 

     setBorder(new TitledBorder("Reports")); 

    } 
    public void initComponents(){ 
     instalationLocation=mainFrame.getInstalationLocation(); 
    } 
} 

ответ

3

Простой опечатка. В вашем конструкторе для вашего ReportsJPanel у вас есть это.

public ReportsJPanel(MainFrame mainframe) { 
    this.mainFrame = mainFrame; 
    setBorder(new TitledBorder("Reports")); 
} 

Вам нужно капитализировать f в MainFrame объект, который вы передаете конструктору.

public ReportsJPanel(MainFrame mainFrame) { 
    this.mainFrame = mainFrame; 
    setBorder(new TitledBorder("Reports")); 
} 

В противном случае, вы будете устанавливать this.mainFrame к себе, и mainframe вы передаете не будет использоваться.

+1

господи .. Только один из тех дней :) Спасибо! –

2
public ReportsJPanel (MainFrame mainframe){ 

     this.mainFrame=mainFrame; 

     setBorder(new TitledBorder("Reports")); 

    } 

фамилии, не соответствующие вашему коду this.mainFrame = mainframe;

method parameter name is mainframe 

Я предлагаю вам использовать затмение как IDE инструмент

+0

Спасибо! Я использую NetBeans 8.0.2. Является ли Eclipse лучше для таких вещей? –

+0

любой из них будет работать, когда вы кодируете строки, подобные этому, он будет отображать предупреждение на этой строке .. так что его легко поймать .. вот что я сделал – JAVAC