将ActionListener实现到一组jButton时出现问题

时间:2011-06-27 08:07:29

标签: java swing jbutton actionlistener

我在一组10个jButton上实现ActionListener时遇到问题。每个按钮的文本属性设置为一个数字,从0到9.所以jButton1将其text属性设置为1,JButton2将有2作为其文本,....,....然后jButton9将有其文本设置为9.当我单击任何这些按钮时,我想将其text属性的值附加到JTextField。

我遇到的问题是每次单击一个按钮时,其文本属性的值打印两次,有时甚至四次甚至四次,它只是随机发生。

例如,如果我单击一个文本4的按钮一次,我可以在JTextField中打印44,如果我再次单击7,我最终会得到4477甚至447777.下面是我的代码

 public class tCalculator extends JFrame implements ActionListener{

    public tCalculator(){
        btn1.addActionListener(this);
        btn2.addActionListener(this);
        btn3.addActionListener(this);
        btn4.addActionListener(this);
        btn5.addActionListener(this);
        btn6.addActionListener(this);
        btn7.addActionListener(this);
        btn8.addActionListener(this);
        btn9.addActionListener(this);
        btnZero.addActionListener(this);
          } 

    public void actionPerformed(ActionEvent evt) {

        String x = txtArea.getText();
        String k = evt.getActionCommand();
        String a = x + k ;
        txtArea.setText(a);

    }}

private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {                                     
        ActionListener actionListener = new tCalculator();
        btn1.addActionListener(actionListener);

    }   

2 个答案:

答案 0 :(得分:4)

您的方法btn1ActionPerformed会添加另一个ActionListener。我们看不到它的名称,但这可以解释你的问题。每当您单击该按钮时,您还有一个Listener,在下次单击时执行。

看起来这个代码是由IDE生成的。在那里删除该操作,您的代码应该可以正常工作。


修改

  1. 删除IDE中的操作
  2. 删除tCalculator的构造函数,并将代码放入JFrame1的构造函数中(initComponents下方。
  3. ...
    initComponents();
    ActionListener actionListener = new tCalculator();
    btn1.addActionListener(actionListener);
    btn2.addActionListener(actionListener);
    ....
    

    这些步骤确保您的监听器每个按钮只注册一次。

    顺便说一句:

    1. tCalculator扩展JFrame没有意义。删除它。
    2. 班级名称以大写字母(TCalculator)开头。一个更好的名字可能是ButtonActionListener或类似的东西。

答案 1 :(得分:2)

  

这是因为你刚刚分配了   你按钮的动作监听器   用这个和方法再次   指定动作监听器   是tCalculator类的实例   所以当你按下按钮boath   动作监听器调用和2个结果   向你展示,只需删除   btn1ActionPerformed方法,它会   工作得很好。现在尝试以下代码................................

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Tcalculator extends JFrame implements ActionListener{
    private JButton btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btnZero;
    private JTextField txtArea;

    public Tcalculator(){
        btn1 = new JButton("1");
        btn2 = new JButton("2");
        btn3 = new JButton("3");
        btn4 = new JButton("4");
        btn5 = new JButton("5");
        btn6 = new JButton("6");
        btn7 = new JButton("7");
        btn8 = new JButton("8");
        btn9 = new JButton("9");
        btnZero = new JButton("0");
        txtArea = new JTextField(15);
        init();
          } 

    //performed all gui operations
    public void init(){

        getContentPane().setLayout(new FlowLayout());
        setSize(200, 200);
        add(txtArea);
        add(btn1);add(btn2);
        add(btn3);add(btn4);
        add(btn5);add(btn6);
        add(btn7);add(btn8);
        add(btn9);add(btnZero);

        btn1.addActionListener(this);
        btn2.addActionListener(this);
        btn3.addActionListener(this);
        btn4.addActionListener(this);
        btn5.addActionListener(this);
        btn6.addActionListener(this);
        btn7.addActionListener(this);
        btn8.addActionListener(this);
        btn9.addActionListener(this);
        btnZero.addActionListener(this);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

    }

    // i am using this your made function nothing changed
    public void actionPerformed(ActionEvent evt) {

        String x = txtArea.getText();
        String k = evt.getActionCommand();
        String a = x + k ;
        txtArea.setText(a);

    }
    public static void main(String args[]){
        new  Tcalculator();
    }

}