天道酬勤,学无止境

JPanel 和 CardLayout 的 NullPointerException 错误(NullPointerException Error with JPanel and CardLayout)

问题

我正在为课堂开发酒店管理软件,但我的代码遇到了一些问题。 在这一点上,我只是想将我在单独的类中创建的 JPanel 添加到我的主 gui 中。 任何帮助将不胜感激。 ~谢谢!

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)

注意:错误发生在“jpanel.add("Room", room.getRoomPanel());”行

代码: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();

    }


}

房间系统.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());

你从未初始化过room

RoomSystem room;

即使您确实将它初始化为RoomSystem room = new RoomSystem() ,您的RoomSystem类中仍然存在另一个问题。 您已经roomPanel ,因此当您尝试调用getRoomPanel()时,类成员为空。 在您的构造函数中,更改

// shadowing the class field roomPanel
JPanel roomPanel = new JPanel(new FlowLayout());  

to 

roomPanel = new JPanel(new FlowLayout());

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • NullPointerException Error with JPanel and CardLayout
    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
  • awt eventqueue 0 空指针异常错误(awt eventqueue 0 nullpointerexception error)
    问题 好的,我收到此错误awt eventqueue 0 nullpointerexception error 。 当我尝试删除JPanel 。 让我感到困惑的是,当我删除另一个JPanel它工作得很好,但这个却没有。 下面的第一个代码显示了JPanel ,当我单击JButton它不会删除JPanel 。 public class buttontime implements ActionListener { //creating actionlistener for clicking on timebutton to bring up a combobox public void actionPerformed(ActionEvent clickTime) { Price priceObject = new Price(); priceObject.getPricepanel(); remove(priceObject.getPricepanel()); priceObject.getPricepanel().revalidate(); add(timeObject.getTimePanel(), BorderLayout.EAST); timeObject.getTimePanel().revalidate(); } } //This one gives me 0 errors
  • JLabel 不会显示图像 - NullPointerException(JLabel won't display image - NullPointerException)
    问题 这是我的第一个 Java GUI 程序,实际上只是我的第二个 Java 程序,所以请放轻松 :) 我的程序是大量谷歌搜索和阅读 Java 文档的结果。 我的问题是我有一张包含 52 张卡片的精灵表,我试图使用 subImage 将这些卡片单独保存到缓冲图像数组中,并且仅出于测试目的,在窗口中显示所有 52 张卡片。 该文件位于我确定的正确目录中。 我相信我的问题在于我对 Jlabels 的使用,或者只是一个愚蠢的错误。 无论如何,这是我的班级进行精灵表拆分 package gui; import java.awt.GridLayout; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; public class crdimgs extends JPanel {/** * */ static final long serialVersionUID = 1L; public final int width = 10; public final int height = 20; public
  • 谁能帮我识别第 65 行的线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常?(Can anyone help me identify the Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException on Line 65?)
    问题 我不断收到一个运行时错误,说我在线程“AWT-EventQueue-0”java.lang.NullPointerException 中有一个异常,它说的是 [line 65] 但对我来说它只是一个基本的 if 语句。 我可以提供一些背景。 这个帧是从一系列帧中调用的,一旦选择了状态,就会发送到包含状态 AC 城市的新帧。 仅当阿拉巴马州不是所选州时,此当前框架才会起作用。 (我还没有为其他状态创建其他框架,因此它们被注释掉了)我可以将代码放在另一个框架中,如果有人需要它应该调用它,但我认为这是很多代码开始和。 在此先感谢大家的帮助。 import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.*; import java.io.*; import java.util.*; public class WetBulbByLocationFrameStates3 extends JFrame { public JLabel stateLabel; public JPanel statePanel = new JPanel(); public JComboBox stateBox; public String [] unitedStates
  • 什么是 Java NullPointerException? [复制](What is a Java NullPointerException? [duplicate])
    问题 这个问题在这里已经有了答案: 什么是 NullPointerException,我该如何解决? (12 个回答) 6年前关闭。 我创建了一个 Java 应用程序并得到这个异常: Exception in thread "main" java.lang.NullPointerException at java.awt.Container.addImpl(Unknown Source) at java.awt.Container.add(Unknown Source) at javax.swing.JFrame.addImpl(Unknown Source) at java.awt.Container.add(Unknown Source) at Executer.<init>(Executer.java:21) at Executer.main(Executer.java:14 这是代码: import javax.swing.*; import java.awt.*; public class Executer { private JLabel lblCommand; private JTextField txtEnter; private JButton btNext, btPrevious; private JPanel panel; public static void
  • 如何将 CardLayout 用于我的 Java 程序以进行登录和菜单项(How do I use CardLayout for my Java Program for Login and Menu Items)
    问题 我正在创建一个“商店”程序,它基本上可以允许员工使用我提供的用户名和密码登录。 登录后,员工可以看到带有四个按钮的“主菜单”:销售登记、PLU 设置、设置和注销。 在此屏幕上,员工可以通过单击任何按钮导航到该屏幕来继续操作。 我不希望每次单击按钮时都弹出一个新窗口,而是希望有一些过渡(或没有过渡)可以转到被单击的页面。 举个例子:当员工启动程序时,他/她会看到登录菜单。 然后员工输入他/她的登录信息并点击登录。 如果信息不正确,系统会提示员工重新输入信息。 如果信息正确,员工现在将被发送到主菜单。 在主菜单上,员工选择“销售登记”,程序进入销售登记。 所有这一切都应该发生在一个窗口中。 到目前为止,我已经添加了我能够做的代码。 我已经创建了所有按钮和标签,但我无法让它们显示在 JFrame 上并使用 CardLayout。 另外,我不知道如何将登录代码与 CardLayout 联系起来。 感谢你们对我的帮助。 这是代码: 主菜单代码 (storeMainMenu.java) import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class storeMainMenu implements
  • 为什么我的JLabel没有显示(Why is my JLabel not showing up)
    问题 我在我的一个抽象类中调用了这种称为check的方法,但是由于某种原因,我添加到JPanel(面板)的JLabel(问题)没有显示。 为什么会这样呢? 任何解释,我都同时使用了重绘和验证方法,但仍然没有任何结果。 回答1 您遇到的问题是您阻止了事件调度线程,阻止了UI的更新或任何新事件的处理。 从这里开始... for(int i = 0; i < 15; i++) { //... //Check to see if user has enetered anything // And is compounded here while(!answered) { Thread.sleep(duration); //... } 您显然是在以一种过程性方式思考(就像在控制台程序中那样),但这不是GUI的工作方式,GUI是事件驱动的,在某个时间点发生了某些事情并且您对此做出了响应。 我的建议是研究Swing Timer ,它可以让您安排在某个时间点回调,在将来某个时间点调用,并在触发它时执行一些操作,该操作可用于修改UI,因为它是在UI的上下文中执行的。美东时间。 有关更多详细信息,请参见Swing中的并发和如何使用Swing计时器。 我还建议您看一下CardLayout ,因为它可能会更容易在不同视图之间进行更改 有关更多详细信息,请参见如何使用CardLayout。 基本
  • 在JFrame中按下按钮后,打开JPanel。(Open a JPanel after pressing a button in a JFrame [duplicate])
    问题 这个问题已经在这里有了答案: 打开一个新的JFrame (5个答案) 6年前关闭。 我知道有人问过这个问题,但我找不到解决方法。 我创建了一个用于登录的JFrame ,并希望在按下“继续输入”按钮以使用新帐户的jpanel打开新窗口后,但不知道如何删除初始框架并显示带有jpanel的框架。你有什么主意吗? 谢谢你! 这是我到目前为止所做的: 这是具有登录名的JFrame : public class LogIn extends JFrame implements ActionListener{ private JLabel labelEmail; private JLabel labelParola; private JTextField textFieldEmail; private JPasswordField textFieldParola; private JButton buttonLogin; private JButton buttonContNou; public LogIn (){ super(); this.setSize(400,200); this.setTitle("Login"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(null); this
  • awt eventqueue 0 nullpointerexception error
    Ok I'm getting this error awt eventqueue 0 nullpointerexception error. When I try to remove a JPanel. Whats confusing me is when I remove another JPanel it works perfectly fine but this one it doesn't. The first Code below shows the JPanel that when I click on a JButton it doesn't remove the JPanel. public class buttontime implements ActionListener { //creating actionlistener for clicking on timebutton to bring up a combobox public void actionPerformed(ActionEvent clickTime) { Price priceObject = new Price(); priceObject.getPricepanel(); remove(priceObject.getPricepanel()); priceObject
  • 在Swing中实现后退/前进按钮(Implementing back/forward buttons in Swing)
    问题 我有一个快速的问题。 我对Swing有了一点经验,最简单的方法是绘制一个相当大的GUI。 作为GUI的一部分,我想要前进和后退按钮。 我尝试采用的方法是实现将当前JPanel推入堆栈并检索先前值(正向或反向(因此为2个堆栈))的方法。 我不能让它正常工作。 也许我正在完全以错误的方式进行操作,或者可能无法在使用它的方式中使用堆栈。 无论哪种情况,这真的让我烦恼。 我想可能有更简单的方法,例如卡片布局,但是我认为这种方法应该可行,这真是令人讨厌。 可能值得注意的是,我正在使用JFrame“基类”并根据屏幕更改中央JPanel。 导航栏作为“基类”的一部分是恒定的,但是 此“基类”的代码: public class Main_Frame extends JFrame{ static JPanel nav_bar_panel; JButton home; JButton back; JButton forward; JPanel currentPanel; static Stack<JPanel> previousPanels; static Stack<JPanel> forwardPanels; public Main_Frame(){ super("DEMO"); setSize(800,600); setLayout(new BorderLayout())
  • 如何在jpanels之间切换?(How can I switch between jpanels?)
    问题 我对Java编程还是很陌生,所以请帮助我纠正我可能忽略的任何错误,或者提供有关如何改进此程序的提示。 好的,现在已经解决了很多问题,现在我有了CardLayout,但是对于如何使管道显示在其中,我仍然有疑问。 当我尝试添加刷新率计时器和速度计时器时,遇到了有关如何声明和初始化布尔变量的问题。 另外,当我编译并运行该游戏时,会得到诸如Game$1.class文件。 我有办法解决这个问题吗,有人可以解释为什么会这样吗? 这些对成品有影响吗? (当游戏被编译并打包到JAR中时。) 单击播放按钮时,我想将playerIsReady设置为true。 然后从那里开始,如果if语句为true,则切换到显示管道的面板,然后开始在屏幕上移动管道。 最好是该管道的3个实例,每个实例在不同的时间开始,但是您可以提供的任何帮助都很好。 其中一些代码需要工作,因此我已经注释掉了某些部分并留下了注释。 我对这个游戏的其他疑问可以在这里找到。 这是我当前的代码 Game.java import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.JFrame; import javax.swing
  • 使用摆动滑动效果更改卡片布局中的当前卡片(Change current card in card layout with slide effect in swing)
    问题 我正在尝试使用幻灯片效果更改卡片布局中的当前可见。 但是我在幻灯片的开头看到了一个我无法调试/解决的轻弹。 我怎样才能避免那部电影? 这是重现错误的示例代码: import java.awt.CardLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Main { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(new CardLayout()); JLabel label1 = new JLabel("Harry Joy"); panel.add(label1, "1"); JLabel label2 = new JLabel("Harsh Raval"); panel.add(label2, "2"); frame.add(panel); frame.pack(); frame.setVisible(true); for (int i = 0; i < 10; i++) {
  • JLabel won't display image - NullPointerException
    this is my first Java GUI program, and really only my second java program, so take it easy on me :) My program is a result of a lot of googling and reading java docs. My problem is that I have a sprite sheet of 52 cards, and am attempting to save these cards individually to a Buffered Image array using subImage, and just for testing purposes, display all 52 in a window. The File is in the correct directory I made sure of that. I believe that my problem lies with my use of Jlabels, or simply a foolish mistake. Anyways, here is my class that does the sprite sheet splitting package gui; import
  • 大小不同的CardLayout(CardLayout with different sizes)
    问题 好吧,我在每张卡上制作不同大小的CardLayout时遇到了一些麻烦。 阅读了《使用多个JFrame:好还是不好的做法》之后? 我注意到我做事的方式不恰当,所以我决定开始学习如何使用CardLayout 我已经尝试过@HovercraftFullOfEels的答案 来自@mKorbel的这个 最后是@Kleopatra的答案 所有这些都是基于气垫船的答案,但有一些变化。 我能够创建CardLayout(并且对此仍然感到困惑),并且我(以某种方式)可以实现Kleopatra的方法,它可以调整框架的大小,但不能如愿,在复制和粘贴代码时,您会注意到它减小了框架的大小。大小仅为几毫米(或像素)。 我不确定这是关于我正在使用的布局管理器,还是因为我没有以正确的方式使用Kleopatra的方法,因为我也不知道@Override方法如何工作或何时使用使用它,什么时候不使用。 这是MCVE(我能做的最短的)。 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; public
  • Java应用程序,具有多个场景(Java Application, with multiple Scenes)
    问题 我正在做一个Java项目,我处理了所有功能,但是当涉及到GUI时,我是一个初学者。 我想知道的是,我可以像javaFX一样在一个阶段中使用java来显示不同的场景吗? 例如,我的出发点是登录面板,登录后清空Jframe并显示下一个画面或场景。 有很多看法我该怎么办? 回答1 基本上,在Swing中, CardLayout允许您在单个容器中的视图之间切换。 首先查看如何使用CardLayout以获得更多详细信息。 以下示例使用Model-View-Controller方法,并且旨在同时解耦代码,因此,恐怕要花很长时间了,但这是使用MVC和代码分离方法的结果(我喜欢编码到接口) 让我们先定义我们想要的视图... public interface IView<C extends IViewController> { public JComponent getView(); public C getViewController(); } public interface ILoginView extends IView<ILoginViewController> { } public interface IWelcomeView extends IView<IWelcomeViewController> { } 显然,我们从视图的基本概念开始,并以此为基础。 每个视图都有一个控制器
  • 如何从另一个单独的类更改Java Cardlayout(How to Change java Cardlayout from another separate class)
    问题 请尝试将CardLayout从另一个类(JPanel)切换到另一个类(JPanel),该类是CardLayout上的卡片之一,我进行了很长时间的搜索和研究,但没有发现任何帮助。 我有一个CardLayout和添加到CardLayout的两个单独的JPanels,现在我希望能够在单独的JPanel或单独的类上执行活动之后切换卡片,那么如何从另一个类切换CardLayout? 我的代码如下。 package myApp; import java.awt.CardLayout; public class TestmyCard extends javax.swing.JFrame { /** * Creates new form TestmyCard */ public TestmyCard() { initComponents(); jPanel1.add(new FirstCard(),"card3"); jPanel1.add(new SecondCard(),"card4"); } public void chgCard(String nwCard){ CardLayout cl = (CardLayout)(jPanel1.getLayout()); cl.show(jPanel1,nwCard); } /** * This method is called from
  • 与CardLayout与手动添加/删除JPanels相比,CardLayout有何特别之处?(What's so special about CardLayout vs manual adding/removal of JPanels?)
    问题 在StackOverflow上有很多次用户问这样的问题... 我有一个主要JPanel包含一个孩子JPanel 。 当用户单击按钮时,子级JPanel应该更改为其他JPanel 。 我该如何做到这一点。 通常,用户实际上曾尝试实现此问题,但无法使其正常工作。 每当我回答这个问题时,我都会告诉他们做这样的事情(简单地说)... JPanel myFrame = new JPanel(); myFrame.remove(oldPanel); myFrame.add(newPanel); 我认为这是一个很合理的答案,而且我个人在我自己的许多Java项目中都使用了它,没有问题。 但是,我总是不满意我的回答,每个人都只是说“使用CardLayout ”。 所以我的问题是,为什么每个人都对CardLayout如此着迷,以至于我的答案应该被否决? 为什么我应该选择使用CardLayout而不是使用上面的代码添加/删除面板? 进一步的问题是,您是否仍建议为具有动态JPanels的接口使用CardLayout 。 例如,我的大多数程序都实现了一个自定义插件框架,其中可能有数百个JPanels ,但是我仅按实际需要加载和显示面板。 对于程序的正常使用,绝不会实际加载或要求使用大多数面板。 对于这种情况,我的编码方法是否是最好的解决方案,因为据我了解,即使绝不会使用CardLayout ,
  • 卡布局内的定位组件(Positioning component inside card layout)
    问题 我有一个主框架,我想使用卡片布局在中心位置显示NewUser类的对象。这是我的主类 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CardLayoutDemo implements ItemListener { JPanel cards; //a panel that uses CardLayout final static String BUTTONPANEL = "Card with JButtons"; final static String TEXTPANEL = "Card with JTextField"; public void addComponentToPane(Container pane) { //Put the JComboBox in a JPanel to get a nicer look. JPanel comboBoxPane = new JPanel(); //use FlowLayout String comboBoxItems[] = { BUTTONPANEL, TEXTPANEL }; JComboBox cb = new JComboBox(comboBoxItems); cb.setEditable(false); cb
  • 将其他类的JPanels添加到cardLayout(Adding JPanels from other classes to the cardLayout)
    问题 我在3个单独的类中有3个窗口,我想使用cardLayout,以便当您单击next按钮时,将出现下一个窗口。 如何将包含不同元素的JPanels添加到一个cardLayout? 这是第一个窗口:(尽管唯一的区别是背景-但它代表了我实际上是如何获得它的想法) public class Window1 extends JPanel implements ActionListener { static CardLayout cardLayout = new CardLayout(); public Window1() { init(); } private void init() { JPanel jp = new JPanel(new BorderLayout()); JPanel jp2 = new Window2(); //JPanel jp3 = new Window3(); JLabel textLabel = new JLabel("Window1"); jp.setBackground(Color.GREEN); jp.add(textLabel, BorderLayout.CENTER); JButton nextButton = new JButton("NEXT"); nextButton.setActionCommand("next"); nextButton
  • 如何在JFrame中切换JPanels(How do I Switch JPanels inside a JFrame)
    问题 关于java组件填充等方面非常绿色,如果我提供的信息不够,请原谅! 考虑下面的代码。 添加菜单和菜单显示在框架中,没问题。 我想在调用gameOn()时删除菜单,而是开始游戏。 下面的代码仅使框架表面“空白”,没有添加游戏面板。 关于如何解决它的任何想法/建议? MenuPanel具有鼠标监听器。 public class GameFrame extends JFrame { private MenuPanel mp; //extends JPanel private GamePanel gp; //extends JPanel public GameFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(new Dimension(GameFrame.XSIZE, GameFrame.YSIZE)); setLocationRelativeTo(null); setVisible(true); mp = new MenuPanel(this); add(mp); } public void gameOn() { remove(mp); GamePanel gp = new GamePanel(5); add(gp); } } 回答1 与其尝试添加删除组件,