问题
I am working on hotel management software for class and I am running into a few issues with my code. At this point, I am simply trying to add a JPanel I created in a separate class into my main gui. Any Help would be greatly appreciated. ~ Thanks!
Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at hotelManage.HotelSystem.showGUI(HotelSystem.java:75)
at hotelManage.HotelSystem.<init>(HotelSystem.java:27)
at hotelManage.HotelSystem.main(HotelSystem.java:115)
Note: The error occurs at the line "jpanel.add("Room", room.getRoomPanel());"
The code: HotelSystem.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class HotelSystem extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1840835913045151061L;
private JFrame mainFrame;
private JPanel mainPanel;
private JButton btnRoom;
private JButton btnCustomer;
private JButton btnOrder;
private JButton btnSearch;
RoomSystem room;
//RoomSystem room = new RoomSystem();
public HotelSystem(){
prepareGUI();
showGUI();
registerListeners();
}
private void prepareGUI(){
mainFrame = new JFrame("Hotel Management System");
mainFrame.setSize(500,500);
mainFrame.setLayout(new GridLayout(1,1));
btnRoom = new JButton("Room Editor");
btnCustomer = new JButton("Customer Editor");
btnOrder = new JButton("Order");
btnSearch = new JButton("Search");
//main panel
mainPanel = new JPanel();
mainPanel.setLayout(new FlowLayout());
mainFrame.add(mainPanel);
mainFrame.setVisible(true);
}
private void showGUI(){
final JPanel jpanel = new JPanel();
jpanel.setBackground(Color.CYAN);
jpanel.setSize(300,300);
CardLayout cLayout = new CardLayout();
cLayout.setHgap(5);
cLayout.setVgap(5);
jpanel.setLayout(cLayout);
JPanel btnPanel = new JPanel(new FlowLayout());
btnPanel.add(btnRoom);
btnPanel.add(btnCustomer);
btnPanel.add(btnOrder);
btnPanel.add(btnSearch);
jpanel.add("Button", btnPanel);
jpanel.add("Room", room.getRoomPanel());
mainPanel.add(jpanel);
mainPanel.setVisible(true);
}
public void registerListeners(){
//register all buttons to self
btnRoom.addActionListener(this);
btnCustomer.addActionListener(this);
btnOrder.addActionListener(this);
btnSearch.addActionListener(this);
} // end registerListeners
public void actionPerformed(ActionEvent e){
System.out.println(e.getActionCommand());
//check all button presses and send
//control to appropriate methods
if (e.getSource() == btnRoom){
} else if (e.getSource() == btnCustomer){
} else if (e.getSource() == btnOrder){
} else if (e.getSource() == btnSearch){
} else {
//lblOutput.setText("something went wrong");
} // end if
} // end actionPerformed
public static void main(String[] args) {
new HotelSystem();
}
}
RoomSystem.java
import java.awt.*;
import javax.swing.*;
public class RoomSystem {
//private JTextField roomName;
private JButton btnEdit;
private JPanel roomPanel;
//private JButton roomCancel;
//array here
public RoomSystem(){
btnEdit = new JButton("Create");
JPanel roomPanel = new JPanel(new FlowLayout());
roomPanel.add(btnEdit);
roomPanel.setVisible(true);
}
public JPanel getRoomPanel() {
return roomPanel;
}
public void setRoomPanel(JPanel roomPanel) {
this.roomPanel = roomPanel;
}
}
回答1:
jpanel.add("Room", room.getRoomPanel());
You've never initialized room
RoomSystem room;
Even if you do initialize it RoomSystem room = new RoomSystem()
, you still have another problem in your RoomSystem
class. You have shadowed roomPanel
, and therefore the class member is null, when you try and call getRoomPanel()
. In your constructor, change
// shadowing the class field roomPanel
JPanel roomPanel = new JPanel(new FlowLayout());
to
roomPanel = new JPanel(new FlowLayout());
来源:https://stackoverflow.com/questions/23177175/nullpointerexception-error-with-jpanel-and-cardlayout