我在一组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);
}
答案 0 :(得分:4)
您的方法btn1ActionPerformed
会添加另一个ActionListener
。我们看不到它的名称,但这可以解释你的问题。每当您单击该按钮时,您还有一个Listener
,在下次单击时执行。
看起来这个代码是由IDE生成的。在那里删除该操作,您的代码应该可以正常工作。
修改强>
tCalculator
的构造函数,并将代码放入JFrame1
的构造函数中(initComponents
下方。
...
initComponents();
ActionListener actionListener = new tCalculator();
btn1.addActionListener(actionListener);
btn2.addActionListener(actionListener);
....
这些步骤确保您的监听器每个按钮只注册一次。
顺便说一句:
tCalculator
扩展JFrame
没有意义。删除它。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();
}
}