2

在以下代码中添加ActionListener两个时出现问题。JButtons

当我单击这两个按钮(b1,b2)时,我想分别打印 1 和 2

但我只能打印 1 或 2。

你能给我一个解决这个问题的方法吗?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class CCCc extends JFrame implements ActionListener{
    JButton b1,b2;
    JTextField f1;

CCCc(){
    setSize(500,200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setResizable(false);
    f1=new JTextField();
    f1.setHorizontalAlignment(JTextField.RIGHT);
    add("North",f1);
    JPanel p1=new JPanel(new GridLayout(1,2));
    add(p1);

    b1=new JButton("1");    
    b1.addActionListener(this); 
    b2=new JButton("2");
    b2.addActionListener(this);
    p1.add(b1);
    p1.add(b2);

    setVisible(true);
}
public void actionPerformed(ActionEvent evt){
    String s=f1.getText();
    f1.setText(s+"1");
}
}
4

3 回答 3

5

不必要地对类进行子类化是一个坏主意,例如JFrameand 。Thread不恰当地实现接口也是一个坏主意。(第三,尝试查看source事件的 是一个坏主意,而且command也很讨厌)

我建议为听众切换到匿名内部类。您会注意到两个按钮都有共同的代码,因此可以将其分解为只需要一个内部类的方法。持有“1”或“2”的变量通常会通过final封闭匿名内部类的方法中的本地字段来引用。但是,您可以使用具有以通常方式访问的字段的非匿名类。

于 2013-01-12T04:02:00.567 回答
2

ActionEvent 参数有很多有用的信息可供您使用,包括对按下按钮的引用——通过getSource()或通过`getActionCommand() 对按钮文本的引用。因此,您可以简单地从 ActionEvent 中获取 actionCommand 并使用它:

public void actionPerformed(ActionEvent evt){
    String s=f1.getText();
    f1.setText(s+ evt.getActionCommand());
}
于 2013-01-12T03:56:43.227 回答
1

我认为这种情况是你想知道在哪个JButtonActionEvent被触发,如果是b1,你必须将 a 加入"1"到文本字段 else"2"中。如果是上述情况,请执行以下操作:

public void actionPerformed(ActionEvent evt){
JButton temp=evt.getSource();
String s=f1.getText()+temp.getText();
f1.setText(s);
}

如果情况不是上述情况,那我说对不起

于 2013-01-12T04:09:48.313 回答