java - 将 JPanel 传递给 CardLayout 时出现 NullPointerException

标签 java class nullpointerexception cardlayout

不久前我问了一个类似的问题,关于在 JFrame 中使用 JPanel 的多个类,在对我的代码进行了大量改进之后,我现在遇到了 CardLayout 的障碍。

当我试图显示我的“2”屏幕时,我收到一个 NullPointerException,它只是一个 BaseScreen,稍后我将使用其他类来继承其属性。更改此代码后,

final CardLayout cardL = new CardLayout();

来自

CardLayout cardL;

在我的构造函数之外,我现在没有出现任何 JPanel!

这是我的代码:

登录类:

/*Login Screen class for allowing
multiple levels of access and security*/

//Imports library files
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.util.*;

//Creates a LoginScreen class that extends the JFrame library class
class LoginScreen extends JFrame {

    //Creates a swing components and CardLayout for organising JPanels
JFrame container = this;
JPanel cardScreen;
JPanel screen = new JPanel();
Image ProgramIcon = Toolkit.getDefaultToolkit().getImage("imageIco.png");
ImageIcon logo = new ImageIcon ("Logo.png");
JLabel icon = new JLabel(logo);
JLabel username = new JLabel("Username");
JLabel password = new JLabel("Password");
JTextField user = new JTextField(18);
JPasswordField pass = new JPasswordField(18);
JButton login = new JButton("Login");
JLabel errorInfo = new JLabel("");
int WIDTH = 800;
int HEIGHT = 500;
int currentPanel = 1;

public static void main(String[] args){
//Sets the GUI (Look and Feel) to the NimROD theme
    try {UIManager.setLookAndFeel("com.nilo.plaf.nimrod.NimRODLookAndFeel");}
    catch (UnsupportedLookAndFeelException e){ JOptionPane.showMessageDialog(null, "GUI Load Error: Unsupported");}
    catch (ClassNotFoundException e) { JOptionPane.showMessageDialog(null, "GUI Load Error: NimROD Missing");} 
    catch (InstantiationException e) { JOptionPane.showMessageDialog(null, "GUI Load Error: Instantiation Missing");} 
    catch (IllegalAccessException e) { JOptionPane.showMessageDialog(null, "GUI Load Error: Illegal Access"); } 

//Creates a new LoginScreen via the LoginScreen method
    LoginScreen LS = new LoginScreen();
}

public LoginScreen(){
//Adds the JPanel to the JFrame and set the JFrame's properties
//Sets the main JPanel to CardLayout platform and adds other JPanels it
    final CardLayout cardL = new CardLayout();
    cardScreen = new JPanel();
    cardScreen.setLayout(cardL);
    cardScreen.add(screen, "1");;
    BaseScreen base = new BaseScreen();
    cardScreen.add(base, "2");
    container.setIconImage(ProgramIcon);
    container.setTitle("Login");
    container.setSize(WIDTH,HEIGHT);
    container.setResizable(false);
    container.setVisible(true);
    container.add(screen);
    container.setDefaultCloseOperation(EXIT_ON_CLOSE);

//Place the components on the JPanel and set there absolute posistions
    screen.setLayout(null);
    screen.add(username);
    screen.add(password);
    screen.add(user);
    screen.add(pass);
    screen.add(login);
    screen.add(icon);
    Dimension iconSize = icon.getPreferredSize();
    Dimension usernameSize = username.getPreferredSize();
    Dimension passwordSize = password.getPreferredSize();
    Dimension loginSize = login.getPreferredSize();
    Dimension userSize = user.getPreferredSize();
    Dimension passSize = pass.getPreferredSize();
    username.setBounds(252,170,usernameSize.width,usernameSize.height);
    password.setBounds(495,170,passwordSize.width,passwordSize.height);
    user.setBounds(180,200,userSize.width,userSize.height);
    pass.setBounds(420,200,passSize.width,passSize.height);
    login.setBounds(375,250,loginSize.width,loginSize.height);
    icon.setBounds(250,50,iconSize.width,iconSize.height);

    login.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent ae) { 
            cardL.show(cardScreen,"2");
            }
        }); 
}

BaseScreen 类:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;


class BaseScreen extends JPanel{

JPanel screen = this;
JButton logout = new JButton("Logout");
ImageIcon title = new ImageIcon("title.png");
JLabel header = new JLabel(title);

public BaseScreen(){

    screen.setVisible(true);
    screen.setLayout(null);
    screen.add(logout);
    screen.add(header);
    Dimension headerSize = header.getPreferredSize();
    Dimension logoutSize = logout.getPreferredSize();
    logout.setBounds(720,440,logoutSize.width,logoutSize.height);
    header.setBounds(0,0,headerSize.width,headerSize.height);

    ButtonHandler handle = new ButtonHandler();
    logout.addActionListener(handle);
}

    public class ButtonHandler implements ActionListener{

    public void actionPerformed(ActionEvent event){

        if (event.getSource() == logout){

        }
    }
  }

}

预先感谢您的任何帮助/提示。

这是旧线程:Using multiple classes with the same JFrame

编辑:

错误如下:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at LoginScreen$1.actionPerformed(LoginScreen.java:84)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
at java.awt.Component.processMouseEvent(Component.java:6288)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6053)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

最佳答案

我不知道您的NullPointerException,但您的示例不起作用。

class LoginScreen extends JFrame

很少需要从顶级容器进行扩展,例如 JFrame,这是不必要的,只会使事情变得复杂,请改用 JPanel 之类的东西并将其添加到您创建的框架...

JFrame container = this;

恕我直言,这是一个坏主意。它只是混淆了问题。如果您确实需要某种方式来引用父对象,请直接使用 this...

在向框架添加组件之前调用 container.setVisible(true),这绝不是一个好主意。事实上,当我正确加载你的程序时(从 EDT 内开始),框架上没有出现任何内容 - 但这可能是由于下一个问题......

您创建cardScreen,创建screen,将screen添加到cardScreen,然后添加 screen 直接到框架...这已有效地从 cardScreen 容器中删除了 screen...这可能会解释您 NPE .

screen.setLayout(null) 这绝不是一个好主意。就我个人而言,我无法忍受不可调整大小的框架,我知道有时会使用它们,但这并不意味着我需要喜欢它们。我想我可能会在没有充分理由的情况下停止回答使用空布局的问题:P

花时间学习和理解布局管理器,它们是 Swing 最强大的功能之一

关于java - 将 JPanel 传递给 CardLayout 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971243/

相关文章:

java - 重写子类中的方法

java - 在运行时在java中创建类的实例

java - 每秒执行一次方法

java - List < Class < 是什么意思?扩展数据类型>>?

java - 如何进行单元测试来确保所有子类都实现一个方法?

java - WSO2中如何设置Web APP的访问超时时间?

c++ - 复制一个对象并使两者共享一个成员变量(C++)

java - DAO 返回 NullPointerException

java - Android Fragment 导致 NullPointerException

java - 引用变量时出现空指针异常