Простой вопрос GUI Action Listener: как изменить имя кнопки?
public class GUI2 implements ActionListener {
private static JPanel panel;
JButton button1;
JButton button4;
public static void main(String[] args) {
GUI2 gui = new GUI2();
gui.go();
}
public void go (){
JFrame frame = new JFrame("Test2 Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setSize(400, 400);
JPanel panel = new JPanel();
panel.setBackground(Color.LIGHT_GRAY);
frame.getContentPane().add(BorderLayout.WEST, panel);
JButton button1 = new JButton("Button1");
JButton button4 = new JButton("Button4");
panel.add(button1);
panel.add(button4);
button1.addActionListener(new ButtonListener());
// работает, меняет имя button1
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
button1.setText("I have been clicked1");
}
});
button4.addActionListener(this);
}
// ошибка: NPE (должен менять имя button4)
@Override
public void actionPerformed(ActionEvent e) {
button4.setText("I have been clicked4");
}
Ответы (1 шт):
Автор решения: Олексій Моренець
→ Ссылка
Вы обьявили поля button1, button4, но в методе go() "переопределили" их локальными переменными. При этом они остались инициализированными значениями по умолчанию null. Это и приводит к NPE.
Если хотите кнопки использовать как локальные переменные, то ваш метод actionPerformed будет вот таким:
@Override
public void actionPerformed(ActionEvent e) {
((JButton) e.getSource()).setText("I have been clicked4");
}
Если поля, то инициализируйте их при объявлении или в конструкторе