多个JButton实例的ActionListener

时间:2013-01-12 03:54:03

标签: java swing event-handling awt actionlistener

在以下代码中将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");
}
}

3 个答案:

答案 0 :(得分:5)

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

我建议切换到监听器的匿名内部类。您会注意到两个按钮都有共同的代码,因此可以将其考虑到只需要一个内部类的方法中。保存“1”或“2”的变量通常通过包含匿名内部类的方法中的final局部字段来引用。但是,您可以使用非匿名类,并以通常的方式访问字段。

答案 1 :(得分:2)

ActionEvent参数包含许多有用的信息,包括对按下的按钮的引用 - 通过getSource()或通过`getActionCommand()按钮的文本。因此,您只需从ActionEvent中获取actionCommand并使用它:

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

答案 2 :(得分:1)

我认为案例是您想知道哪个JButton,A ctionEvent被触发,如果是b1,您必须加入"1"到其他文本域"2"。 如果是上述情况,请执行以下操作:

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

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