javax.swing.JPanel.getBorder() 返回的 NullPointerException

NullPointerException returned by javax.swing.JPanel.getBorder()

这是我的代码:

class MyFrame extends JFrame {
    public MyFrame() {
        setTitle("Carrera de coets");
        setBounds(15, 15, 310, 230);
        setResizable(false);

        MyPanel panel1 = new MyPanel();
        MyPanel panel2 = new MyPanel();

        Border loweredEtchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);

        TitledBorder titledBorder1 = BorderFactory.createTitledBorder(loweredEtchedBorder, "32WESSDS");
        TitledBorder titledBorder2 = BorderFactory.createTitledBorder(loweredEtchedBorder, "LDSFJA32");

        panel1.setBorder(titledBorder1);
        panel2.setBorder(titledBorder2);

        add(panel1, BorderLayout.NORTH);
        add(panel2, BorderLayout.SOUTH);
    }
}

class MyPanel extends JPanel {
    public MyPanel() {
        setLayout(new GridLayout(2, 1));
        
        JPanel panel1, panel2;
        
        panel1 = new JPanel();
        panel2 = new JPanel();

        JLabel label1, label2;
        JTextField textField1, textField2;
        JButton button1, button2;
        
        label1 = new JLabel("Velocitat:");
        label2 = new JLabel("Increment:");
        
        textField1 = new JTextField(10);
        textField2 = new JTextField(10);
        
        button1 = new JButton("Modificar");
        button2 = new JButton("Modificar");
        
        MyListener listener1, listener2;
        
        listener1 = new MyListener(this, textField1);
        listener2 = new MyListener(this, textField2);
        
        button1.addActionListener(listener1);
        button2.addActionListener(listener2);
        
        panel1.add(label1);
        panel1.add(textField1);
        panel1.add(button1);
        panel2.add(label2);
        panel2.add(textField2);
        panel2.add(button2);

        add(panel1);
        add(panel2);
    }

    private class MyListener implements ActionListener {
        private String identifier;
        private JTextField textField;

        public MyListener(JPanel panel, JTextField textField) {
            identifier = ((TitledBorder) panel.getBorder()).getTitle();
            this.textField = textField;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            Do something with identifier and textField.
        }
    }
}

这是它的样子:

我想做的是为这些按钮添加功能,但是这一行:identifier = ((TitledBorder) panel.getBorder()).getTitle(); 返回 NullPointerException,我不明白为什么,因为那些 JPanel 实例确实有带标题的边框。

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.swing.border.TitledBorder.getTitle()" because the return value of "javax.swing.JPanel.getBorder()" is null

好的,正如其他人已经说过的,您没有提交 TitledBorder 的实际实例。这意味着,您的面板内没有边框。我稍微重构了你的代码,现在可以了。

我评论了我工作的台词

class MyFrame extends JFrame {
    public MyFrame() {
        setTitle("Carrera de coets");
        setBounds(15, 15, 310, 230);
        setResizable(false);

        // instantiate your Borders before you instantiate your Panels
        Border loweredEtchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);

        TitledBorder titledBorder1 = BorderFactory.createTitledBorder(loweredEtchedBorder, "32WESSDS");
        TitledBorder titledBorder2 = BorderFactory.createTitledBorder(loweredEtchedBorder, "LDSFJA32");

        // instantiate your Panels and hand in the borders
        MyPanel panel1 = new MyPanel(titledBorder1);
        MyPanel panel2 = new MyPanel(titledBorder1);

        // WRONG HERE. REMOVE IT.
        // panel1.setBorder(titledBorder1);
        // panel2.setBorder(titledBorder2);

        add(panel1, BorderLayout.NORTH);
        add(panel2, BorderLayout.SOUTH);
    }
}


class MyPanel extends JPanel {

    // take the border as argument for the constructor
    public MyPanel(TitledBorder border) {
        setLayout(new GridLayout(2, 1));

        // SET THE BORDER
        setBorder(border);

        JPanel panel1, panel2;

        panel1 = new JPanel();
        panel2 = new JPanel();

        JLabel label1, label2;
        JTextField textField1, textField2;
        JButton button1, button2;

        label1 = new JLabel("Velocitat:");
        label2 = new JLabel("Increment:");

        textField1 = new JTextField(10);
        textField2 = new JTextField(10);

        button1 = new JButton("Modificar");
        button2 = new JButton("Modificar");

        MyListener listener1, listener2;

        listener1 = new MyListener(this, textField1);
        listener2 = new MyListener(this, textField2);

        button1.addActionListener(listener1);
        button2.addActionListener(listener2);

        panel1.add(label1);
        panel1.add(textField1);
        panel1.add(button1);
        panel2.add(label2);
        panel2.add(textField2);
        panel2.add(button2);

        add(panel1);
        add(panel2);
    }

    private class MyListener implements ActionListener {
        private String identifier;
        private JTextField textField;

        public MyListener(JPanel panel, JTextField textField) {
            identifier = ((TitledBorder) panel.getBorder()).getTitle();
            this.textField = textField;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            System.out.println("And the winner is: " + identifier);
        }
    }
}

我通过这样做修复了它:

class MyFrame extends JFrame {
    public MyFrame() {
        setTitle("Carrera de coets");
        setBounds(15, 15, 310, 230);
        setResizable(false);

        MyPanel panel1 = new MyPanel();
        MyPanel panel2 = new MyPanel();

        Border loweredEtchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);

        TitledBorder titledBorder1 = BorderFactory.createTitledBorder(loweredEtchedBorder, "32WESSDS");
        TitledBorder titledBorder2 = BorderFactory.createTitledBorder(loweredEtchedBorder, "LDSFJA32");

        panel1.setBorder(titledBorder1);
        panel2.setBorder(titledBorder2);

        panel1.listen(); // New
        panel2.listen();

        add(panel1, BorderLayout.NORTH);
        add(panel2, BorderLayout.SOUTH);
    }
}

class MyPanel extends JPanel {

    private JTextField textField1, textField2;
    private JButton button1, button2;
    private MyListener listener1, listener2;

    public MyPanel() {
        setLayout(new GridLayout(2, 1));
        
        JPanel panel1, panel2;
        
        panel1 = new JPanel();
        panel2 = new JPanel();

        JLabel label1, label2;
        
        label1 = new JLabel("Velocitat:");
        label2 = new JLabel("Increment:");
        
        textField1 = new JTextField(10);
        textField2 = new JTextField(10);
        
        button1 = new JButton("Modificar");
        button2 = new JButton("Modificar");
        
        panel1.add(label1);
        panel1.add(textField1);
        panel1.add(button1);
        panel2.add(label2);
        panel2.add(textField2);
        panel2.add(button2);

        add(panel1);
        add(panel2);
    }

    // New
    public void listen() {
        listener1 = new MyListener(this, textField1);
        listener2 = new MyListener(this, textField2);
        
        button1.addActionListener(listener1);
        button2.addActionListener(listener2);
    }

    private class MyListener implements ActionListener {
        private String identifier;
        private JTextField textField;

        public MyListener(JPanel panel, JTextField textField) {
            identifier = ((TitledBorder) panel.getBorder()).getTitle();
            this.textField = textField;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            System.out.println(identifier + " " + textField.getText());
        }
    }
}