我的老师告诉我,actionListener
的单独课程是最好的。在单独的类中,我应该只创建一个actionListener方法,例如。
public void actionPerformed(ActionEvent e) {
if(e.getSource() == myButton) {
//do something
}
else if(e.getSource() == myComboBox) {
//do something
}
}
或者我应该做多少?我有一种感觉,我应该做很多,但我不知道如何去做。不同的参数是什么?我将在我的View类中创建这个类的实例,其中按钮和组合框是。 (这将是Controller类,因为我试图做MVC)
对于按钮我希望背景在鼠标悬停在其上时改变颜色,然后当点击时做一些事情。组合框只需要返回被选为String的任何选项。
答案 0 :(得分:2)
当您为动作侦听器创建单独的类时,您可以重用您创建的动作事件。
我会举一个例子
这个类有一个动作监听器
class AListener implements ActionListener
{
JTextField tf;
AListener(JTextField tf)
{
this.tf=tf;
}
public void actionPerformed(ActionEvent e)
{
if((e.getActionCommand()).equals("Button1"))
tf.setText("Button1 clicked");
if((e.getActionCommand()).equals("Button2"))
tf.setText("Button2 clicked");
if((e.getActionCommand()).equals("Button3"))
tf.setText("Button3 clicked");
}
}
这是GUI类,它有3个buttons
和一个text field
,每个按钮在文本字段中打印出不同的内容,因此您可以看到,使3个不同是不合逻辑的GUI类中的动作侦听器方法。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ActionDemo extends JFrame
{
public ActionDemo()
{
setLayout(new FlowLayout());
// Add buttons to the frame
JButton b1=new JButton("Button1");
JButton b2=new JButton("Button2");
JButton b3=new JButton("Button3");
JTextField tf=new JTextField(10);
AListener listen=new AListener(tf);
b1.addActionListener(listen);
b2.addActionListener(listen);
b3.addActionListener(listen);
add(b1);add(b2);add(b3);add(tf);
}
public static void main(String[] args)
{
ActionDemo frame = new ActionDemo();
frame.setTitle("Action Demo");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 100);
frame.setVisible(true);
}
}
现在,每次单击一个按钮时,只会调用一个动作侦听器方法。在这个方法中,我将检查哪个按钮叫我。
答案 1 :(得分:2)
我更喜欢为每个控制器动作编写一个单独的动作侦听器。它使我的简单思想变得简单。
我的经验法则是,对于非常短暂的(1-3行)动作听众,我将使它们成为内联匿名类。
对于中等大小的动作侦听器(1到3种方法),我将它们变成内部类,特别是如果动作侦听器需要来自外部主类的3个或更多字段。
对于大型动作听众,我会写一个单独的课程。