在以下代码中将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");
}
}
答案 0 :(得分:5)
不必要地对类(例如JFrame
和Thread
)进行子类化是一个坏主意。不恰当地实现接口也是一个坏主意。 (第三,尝试查看事件的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);
}
如果案件不是上述情况,那么我说对不起