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());
}
}
}
这是我的代码:
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());
}
}
}