2014-04-26 6 views
-1

"RoomSystem.Java"코드에 정의 된 JPanel을 제대로 추가하려면 어떻게해야합니까? JPanel 문제 : java.lang.NullPointerException

ERROR (오류) :

Exception in thread "main" java.lang.NullPointerException 
    at java.awt.Container.addImpl(Unknown Source) 
    at java.awt.Container.add(Unknown Source) 
    at hotelManagement.MainSystem.<init>(MainSystem.java:68) 
    at hotelManagement.MainSystem.main(MainSystem.java:129) 

행 68 : getMainPanel().add(roomPanel, "Rooms");

전체 코드 :

MainSystem.Java :

package hotelManagement; 


import java.awt.CardLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class MainSystem extends JFrame{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private JFrame mainFrame; 
    private JPanel mainPanel; 
    private static JPanel roomPanel; 
    private JPanel btnPanel; 
    private JButton btnRoom; 
    private JButton btnCustomer; 
    private JButton btnOrder; 
    private JButton btnSearch; 
    private CardLayout cLayout; 
    private JLabel lblUpdate; 



    public MainSystem(){ 
     mainFrame = new JFrame("Hotel Management System"); 
     mainFrame.setSize(500,300); 
     mainFrame.setLayout(new GridLayout(2,0)); 

     btnRoom = new JButton("Room Editor"); 
     btnRoom.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) 
      { 
       getCLayout().show(getMainPanel(), "Orders"); 
       System.out.println("You clicked Rooms"); 
      } 
     });  
     btnCustomer = new JButton("Customer Editor"); 
     btnOrder = new JButton("Order"); 
     btnSearch = new JButton("Search"); 

     lblUpdate = new JLabel("Instructions/details will go here."); 

     btnPanel = new JPanel(); 
     btnPanel.add(btnRoom); 

     btnPanel.add(btnCustomer); 
     btnPanel.add(btnOrder); 
     btnPanel.add(btnSearch); 
     btnPanel.add(lblUpdate); 

     setMainPanel(new JPanel()); 
     setCLayout(new CardLayout()); 
     getMainPanel().setLayout(getCLayout()); 


     getMainPanel().add(btnPanel, "Buttons"); 
     getMainPanel().add(roomPanel, "Rooms"); 

     mainFrame.add(getMainPanel()); 
     mainFrame.setVisible(true); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 




    } 


    public JFrame getMainFrame(){ 
     return mainFrame; 
    } 

    public void setMainFrame(JFrame mainFrame){ 
     this.mainFrame = mainFrame; 
    } 

    public CardLayout getCLayout(){ 
     return cLayout; 
    } 

    public void setCLayout(CardLayout cLayout){ 
     this.cLayout = cLayout; 
    } 

    public JPanel getMainPanel(){ 
     return mainPanel; 
    } 

    public void setMainPanel(JPanel mainPanel){ 
     this.mainPanel = mainPanel; 
    } 

    public JPanel getBtnPanel(){ 
     return btnPanel;  
    } 

    public void setBtnRoom(JPanel btnPanel){ 
     this.btnPanel = btnPanel; 
    } 

    public JPanel getRoomPanel() { 
     return roomPanel; 
    } 

    public static void setRoomPanel(JPanel roomPanel) { 
     MainSystem.roomPanel = roomPanel; 
    } 

    public static void main(String[] args) { 
     new MainSystem(); 
    } 

} 

RoomSystem.Java

package hotelManagement; 

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Label; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JComboBox; 

import javax.swing.JPanel; 

public class RoomSystem extends MainSystem { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private JButton btnEdit; 
    private JButton btnBack; 
    private JComboBox<String> roomType; 
    String[] roomArray = { "Penthouse", "Large Room", "Small Room" }; 

    public RoomSystem() { 
     setRoomType(new JComboBox<>(roomArray)); 

     btnEdit = new JButton("Create"); 
     btnEdit.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) 
      { 
       System.out.println("You clicked Create"); 
      } 
     });  

     btnBack = new JButton("Return"); 
     btnBack.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) 
      { 
       System.out.println("You clicked Back"); 
      } 
     }); 

     Label lblRoom= new Label("Room Type: "); 


     setRoomPanel(new JPanel()); 
     getRoomPanel().setLayout(new GridBagLayout()); 
     GridBagConstraints gridConst = new GridBagConstraints(); 

     gridConst.gridx = 0; 
     gridConst.gridy = 0; 
     getRoomPanel().add(lblRoom, gridConst); 
     gridConst.gridx = 1; 
     gridConst.gridy = 0; 
     getRoomPanel().add(getRoomType(), gridConst); 

     gridConst.gridx = 0; 
     gridConst.gridy = 2; 
     getRoomPanel().add(btnEdit, gridConst); 
     gridConst.gridx = 1; 
     gridConst.gridy = 2; 
     getRoomPanel().add(btnBack, gridConst); 

    } 



    public JComboBox<String> getRoomType(){ 
     return roomType; 

    } 

    public void setRoomType(JComboBox<String> roomType){ 
     this.roomType = roomType; 

    } 



} 

답변

2

가장 큰 문제는 상속을 부적절하게/부정확하게/불필요하게 사용하는 것입니다. RoomSystemMainSystem으로 확장되어 있기 때문에 roomPanel은 두 클래스간에 공유됩니다. 그것은 그렇게 작동하지 않습니다. 그래서 MainSystemroomPanel은 당신이 올바르게 사용하는 방법을 알고 것처럼 보이지 않기 때문에, 상속을 사용없이 NullPointerException

당신은 클래스 디자인을 재고 할 필요가

의 원인이되는 초기화하지 않으며, 때문에 않습니다 그것은 적절하지 않습니다.

하지만 지금 상황을 설명해주세요.

RoomSystem이 있으며 MainSystem입니다. 그래서 RoomSystem는이 자신의 엔티티하지만 MainSystem (안 ) 같은 속성과 메소드를 가지고 있지만 객체 참조의 측면에서 전혀 관계가 없습니다. 따라서 RoomSystem에서 setRoomPanel(new JPanel());을 호출하면 MainSystem 클래스가 아닌 RoomSystem 클래스의 roomPanel 만 설정하면됩니다.

static 필드 roomPanel은 초보자를위한 올바른 수정 프로그램처럼 보일 수 있지만 완전히 부적절합니다. 당신이 RoomSystem이 원하는 경우는 당신이 그것을 extends Panel하지MainSystem을해야하고, 당신은 단지 MainSystem 프레임에 RoomSystem 패널을 추가 할 수 있습니다, 자신의 패널입니다.

CardLayout과 같은 것을 MainSystem에서 RoomSystem으로 전달해야하는 경우 생성자를 통해 주입 할 수 있습니다. 그들은 지금 같은 객체를 참조로

public class RoomSystem extends JPanel { 
    private CardLayout; 

    public RoomSystem(CardLayout layout) { 
     this.layout = layout; 
    } 
} 

그럼 당신은 RoomSystem 클래스의 MainSystem에서 레이아웃을 사용할 수 있습니다.

다른 디자인 옵션은 카드를 설정하는 방법으로 인터페이스를 구현하는 것입니다 (MainSystem 클래스에 있음).

public interface CardViewChanger { 
    public void setCard(String card); 
    public void previousCard(); 
} 

public class MainSystem extends JFrame implements CardViewChanger { 
    RoomSystem roomPanel = new RoomSystem(this); 
    CardLayout layout; 

    @Override 
    public void setCard(String card) { 
     layout.show(this, card); 
    } 

    @Override 
    public void previousCard() { 
     layout.next(); 
    } 
} 

public class RoomSystem extends JPanel { 
    CardViewChanger cardChanger; 

    public RoomSystem(CardViewChanger cardChanger) { 
     this.cardChanger = cardChanger; 

     ... 
     public void actionPerformed(ActionEvent e) { 
      cardChanger.previousCard(); 
     } 
    } 
} 
0

roomPanel이 null입니다. mainPanel에 추가하기 전에 초기화해야합니다.