ActionListener用于多个JButton实例



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

不必要地子类化JFrameThread等类是一个坏主意。不恰当地实现接口也是一个坏主意。(第三,试图查看事件的source是一个坏主意,command也很糟糕)

我建议为侦听器切换为匿名内部类。您将注意到两个按钮都有公共代码,因此可以将其分解为只需要一个内部类的方法。包含"1"或"2"的变量通常通过封闭匿名内部类的方法中的final局部字段来引用。但是,您可以使用非匿名类,并以常规方式访问字段。

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

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

我认为情况是你想知道在哪个JButton上,A ctionEvent被触发,如果是b1,你必须将"1"加入到文本字段否则"2"。如果是上述情况,则执行以下操作:

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

如果不是上述情况,那么我说Sorry

相关内容

  • 没有找到相关文章

最新更新