NullPointerException错误和cardlayout [重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

NullPointerException仅在我单击“下一步”按钮时出现。我正在尝试使用cardlayout将帧转换到另一个面板,但我没有这样做。

第二个问题:如何让我当前的面板转换到另一个类的下一个面板(LoginPanel)?我已经创建了它的一个实例

public class InsuranceMain extends JFrame {

    private CardLayout cardPanel;
    private JPanel buttonPanel;
    private JButton next;
    private JLabel label;

    public InsuranceMain() {

        buttonPanel = new JPanel();
        JPanel card1 = new JPanel();
        JPanel cards = new JPanel(cardPanel);
        LoginPanel loginPanelA = new LoginPanel(this);
        CardLayout cardLayout = new CardLayout();
        cards.setLayout(cardLayout);

        next = new JButton("Next"); // Button
        label = new JLabel("Test");

        // Main frame settings
        setTitle("Travel Insurance Application");
        setSize(300, 300);
        setLayout(new FlowLayout());
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        buttonPanel.add(next);
        add(buttonPanel);

        card1.add(label);
        cards.add(card1, "card1");
        cards.add(loginPanelA, "loginPanelA");

        next.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                if(e.getSource() == next) {

                    cardLayout.show(cards, "loginPanelA");
            }}
        });
    }

    public static void main(String[] args) {

        InsuranceMain test = new InsuranceMain();
    }
}

这是我的LoginPanel代码。如果它非常杂乱,我道歉

public class LoginPanel extends JPanel {

    private JButton loginB, registerB, clearB;
    private JTextField nricTextField, passwordTextField;
    private JLabel nric, password, loginTitle;
    private JPanel centerPanel, southPanel;

    private InsuranceMain main;

    public LoginPanel(InsuranceMain main){

        this.main = main;

        // JLabels
        loginTitle = new JLabel("Insurance Login", JLabel.CENTER);
        nric = new JLabel("NRIC: ");
        password = new JLabel("Password: ");

        // JTextField
        nricTextField = new JTextField("");
        passwordTextField = new JTextField("");

        // JButton
        loginB = new JButton("Login");
        loginB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                if(e.getSource() == loginB) {

                    //cardLayout.show(cards, "card1");

            }}
        });
        registerB = new JButton("Register");
        clearB = new JButton("Clear");


        // North Panel
        setLayout(new BorderLayout()); // main panel's layout
        add(loginTitle, BorderLayout.NORTH);


        // Center Panel
        centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(2,2));
        centerPanel.add(nric);
        centerPanel.add(nricTextField);
        centerPanel.add(password);
        centerPanel.add(passwordTextField);
        add(centerPanel, BorderLayout.CENTER); 

        // South Panel
        southPanel = new JPanel();
        southPanel.setLayout(new FlowLayout());
        southPanel.add(loginB);
        southPanel.add(registerB);
        southPanel.add(clearB);
        add(southPanel, BorderLayout.SOUTH);
    }
}
java swing nullpointerexception cardlayout
2个回答
2
投票

actionPerformed方法中的NPE只能由cardLayout为null引起。而不是

CardLayout cardLayout = (CardLayout) cards.getLayout(); // yields null

您应该创建所需的布局。

CardLayout cardLayout = new CardLayout();

另见Cannot refer to a non-final variable inside an inner class defined in a different method

另见欧文的评论。


1
投票
//change to 
    final CardLayout cardLayout = new CardLayout();
    final JPanel cards = new JPanel(cardPanel);
    cards.setLayout(cardLayout);

你必须声明变量final,这样你就可以从anonymus内部类中引用它们新的ActionListener(){}

还可以使用java的命名约定来命名classes =>以大写字母开头,即InsuranceMain,LoginPanel

© www.soinside.com 2019 - 2024. All rights reserved.