我在以下代码中将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");
}
}
不必要地子类化JFrame
和Thread
等类是一个坏主意。不恰当地实现接口也是一个坏主意。(第三,试图查看事件的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