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

javax.swing.JPanel.getBorder()返回的NullPointerException,java,swing,jpanel,Java,Swing,Jpanel,这是我的代码: class MyFrame extends JFrame { public MyFrame() { setTitle("Carrera de coets"); setBounds(15, 15, 310, 230); setResizable(false); MyPanel panel1 = new MyPanel(); MyPanel panel2 = new MyPa

这是我的代码:

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实例确实有标题边框

线程“main”java.lang.NullPointerException中的异常:无法调用“javax.swing.border.TitledBorder.getTitle()”,因为“javax.swing.JPanel.getBorder()”的返回值为null


好的,正如其他人已经说过的,您没有提交标题边界的实际实例。这意味着,面板内没有边框。我对你的代码进行了一点重构,现在可以了

我对我写的台词发表了评论

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());
        }
    }
}

您仅在构造函数完成后设置边框,但您试图在构造函数调用期间获取边框。您希望
MyPanel
实例在调用
newmyListener的构造函数中有什么边界(这里是textField1)?@JonSkeet哦,我现在明白了。我解决了这个问题。非常感谢你!我会回答我自己的问题,以防万一这对别人有帮助。