Прослушиватель действий не отвечает на щелчок в Java

#java

#java

Вопрос:

Ничего не происходит, когда я нажимаю на кнопку. Вот код.

Как я могу понять проблему? Я сделал это быстро, чтобы возиться с изменением цвета фонов jpanel, но затем прослушиватель действий не работал, когда я тестировал его с сообщением.

 import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Changcolorbtns extends JFrame implements ActionListener{
    JLabel lbl;
    JPanel p1,p2,p3,p4;
    JButton btn1,btn2,btn3,btn4;
public Changcolorbtns() {
    //JFrame 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setLocationRelativeTo(null);
     setSize(500,400);
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setLayout(null);

    // declaring 
    JButton btn1 = new JButton("Red");
    JButton btn2 = new JButton("Blue");
    JButton btn3 = new JButton("Black");
    JButton btn4 = new JButton("Green");
    JPanel p1 = new JPanel();
    JPanel p2 = new JPanel();
    JPanel p3 = new JPanel();
    JPanel p4 = new JPanel();
   JLabel lbl = new JLabel("hit me");
    //settingn location and size
    lbl.setBounds(60,60,60,60);
    p1.setBounds(0,0,250,250);
    p2.setBounds(0,250,250,250);
    p3.setBounds(250,0,250,250);
    p4.setBounds(250,250,250,250);
    btn1.setBounds(50,50,100,100);
    btn1.setVisible(true);
    btn2.setBounds(250,50,100,100);
    btn3.setBounds(50,250,100,100);
    btn4.setBounds(250,250,100,100);
     //adding 2 jpane
    p1.add(btn1);
    p2.add(btn2);
    p3.add(btn3);
    p4.add(btn4);

    //setting jpanel color
    p1.setBackground(Color.RED);
    p2.setBackground(Color.RED);
    p3.setBackground(Color.RED);
    p4.setBackground(Color.RED);
    //adding to jframe
    add(p1);
    add(p2);
    add(p3);
    add(p4);


    //adding action listeners
   btn1.addActionListener(this);

    //setting visible

    setVisible(true);
}

 @Override
    public void actionPerformed(ActionEvent e){

       if(e.getSource()==btn1){
           JOptionPane.showMessageDialog(null, "hi");
       }
    }
    public static void main(String[] args) {
         new Changcolorbtns();
    }
}
  

Комментарии:

1. Заменить JButton btn1 = new JButton("Red"); на this.btn1 = new JButton("Red"); . Вы затеняете переменную экземпляра (используемую в методе actionPerformed) локальной переменной с тем же именем.

2. Спасибо, теперь я вижу, что я сделал не так!

3. Помимо ошибки, есть ли у вас какие-либо советы, например, по моему коду, если я должен прокомментировать больше очистки кода или какие-либо ненужные строки, которые я кодирую?

4. Вы должны начать с отступа и выбрать гораздо лучшие имена. RedButton намного понятнее, чем btn1.

5. хорошо, в то время, когда я создавал все эти имена btn1, p1 и lbl, я просто экспериментировал с прослушивателем действий, но я сделаю отступ, спасибо.