Java 将ActionListener实现到一组JButton时出现问题

Java 将ActionListener实现到一组JButton时出现问题,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,我在一组10个JButton上实现ActionListener时遇到问题。每个按钮的文本属性都设置为数字,从0到9。所以jButton1将其文本属性设置为1,JButton2将其文本设置为2。。。。然后jButton9将其文本设置为9。当我单击这些按钮时,我想将其文本属性的值附加到JTextField 我遇到的问题是,每当我点击一个按钮,它的文本属性值就会被打印两次,有时是三次,有时甚至四次,这只是随机发生的 例如,如果我单击一次文本为4的按钮,我可以在JTextField中打印44,如果我再次

我在一组10个JButton上实现ActionListener时遇到问题。每个按钮的文本属性都设置为数字,从0到9。所以jButton1将其文本属性设置为1,JButton2将其文本设置为2。。。。然后jButton9将其文本设置为9。当我单击这些按钮时,我想将其文本属性的值附加到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);

    }   

您的方法
btn1ActionPerformed
添加另一个
ActionListener
。我们看不出它的名称,但这可以解释您的问题。无论何时单击该按钮,都会有一个以上的
侦听器
,该侦听器将在下次单击时执行

看起来这段代码是由IDE生成的。删除那个动作,你的代码就可以工作了


编辑:

  • 删除IDE中的操作
  • 删除
    tCalculator
    的构造函数,并将代码放入
    JFrame1
    的构造函数中(以下
    initComponents
  • 这些步骤确保每个按钮只注册一次侦听器

    顺便说一句:

  • tCalculator
    扩展
    JFrame
    是没有意义的。删除它
  • 类名以大写字母(
    TCalculator
    )开头。更好的名称可以是
    ButtonActionListener
    或类似的名称

  • 您的方法
    btn1ActionPerformed
    添加了另一个
    ActionListener
    。我们看不到调用它的位置,但这可以解释您的问题。每当您单击按钮时,您就会有一个
    侦听器
    ,该侦听器将在下次单击时执行

    看起来这段代码是由IDE生成的。如果在那里删除该操作,代码就会正常工作


    编辑:

  • 删除IDE中的操作
  • 删除
    tCalculator
    的构造函数,并将代码放入
    JFrame1
    的构造函数中(以下
    initComponents
  • 这些步骤确保每个按钮只注册一次侦听器

    顺便说一句:

  • tCalculator
    扩展
    JFrame
    是没有意义的。删除它
  • 类名以大写字母(
    TCalculator
    )开头。更好的名称可以是
    ButtonActionListener
    或类似的名称
  • 因为你刚刚分配了 将操作侦听器添加到您的按钮 用这种方法,你会再次成功 协助动作监听器 是tCalculator类的实例 所以当你按下按钮的时候 调用了action listener和2个结果 如果显示给您,只需删除 BTN1ActionExecuted方法,它将 工作正常。请立即尝试以下代码

    因为你刚刚分配了 将操作侦听器添加到您的按钮 用这种方法,你会再次成功 协助动作监听器 是tCalculator类的实例 所以当你按下按钮的时候 调用了action listener和2个结果 如果显示给您,只需删除 BTN1ActionExecuted方法,它将 工作正常。请立即尝试以下代码


    我不知道btn1ActionPerformed在哪里被调用。@Giann:看起来像是由IDE生成的
    btn1ActionPerformed
    ,所以我假设它是在一些生成的
    Listener
    中被调用的,我们在这里看不到。Peter,你是在暗示btn1ActionPerformed不是必需的吗?因为如果我在btn1ActionPerformed中注释掉代码,那么就没有了无论单击哪个按钮,JTextField中都会显示内容!!如果为True,则btn1ActionPerformed由IDE@Name.IsNullOrEmpty:看起来我们需要查看您的完整代码。如果
    tCalculator
    是您正在显示的
    JFrame
    ,则会调用构造函数并添加侦听器。您描述的问题be now的意思是,以前没有调用构造函数,而只在
    btn1ActionPerformed
    中调用。这就是为什么在注释它时它不起作用。我看不出btn1ActionPerformed在哪里被调用。@Giann:看起来
    btn1ActionPerformed
    是由IDE生成的,所以我假设它是在某个生成的
    列表中被调用的r
    我们在这里看不到。Peter,你是在暗示btn1ActionPerformed不是必需的吗?因为如果我在btn1ActionPerformed中注释掉代码,那么无论我单击哪个按钮,JTextField中都不会显示任何内容!!如果是,btn1ActionPerformed是由IDE@Name.IsNullOrEmpty:看起来我们需要查看您的完整代码。如果
    tCalculator
    是您正在显示的
    JFrame
    ,则会调用构造函数并添加侦听器。您现在描述的问题意味着,以前没有调用构造函数,而只在
    btn1ActionPerformed
    中调用。这就是为什么在注释它时它不起作用。请立即寻求更好的帮助r、 发布一个。请尝试用几个按钮来重现问题,而不是10.BTW-这些代码片段读起来完全是胡说八道。按钮在哪里实例化?为什么
    actionPerformed()
    创建一个完整的新GUI?在这样做之后,为什么新的(不可见的)GUI添加到btn1(仅限)中作为一个监听器?即使在这些代码片段中也显示出误解的程度,这表明您目前应该编写比GUI更简单的代码。“…这是完整的代码。”
    F:\..\JFrame1.java:63:表达式的非法开始公共类tCalculator extensed JFrame实现ActionListener{^1 error
    Give
    ...
    initComponents();
    ActionListener actionListener = new tCalculator();
    btn1.addActionListener(actionListener);
    btn2.addActionListener(actionListener);
    ....
    
    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();
        }
    
    }