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哦,我现在明白了。我解决了这个问题。非常感谢你!我会回答我自己的问题,以防万一这对别人有帮助。