class SomeClass implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// do something
}
}
如果我有4个按钮,我真的需要创建4个类来处理每个按钮吗? 没有办法在当前类中使用方法吗?
答案 0 :(得分:3)
您可以使用匿名内部类。例如:
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doButton1Stuff();
}
});
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doButton2Stuff();
}
});
匿名内部类可以访问所有包含类的方法和变量,包括private
个。
或者,您可以创建一个ActionListener
并为所有四个按钮注册它。这样做的缺点是你需要ActionListener
内部的逻辑来确定按下了哪个按钮(假设每个按钮做了不同的事情):
ActionListener a = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button1) {
doButton1Stuff();
}
if (e.getSource() == button2) {
doButton2Stuff();
}
...
}
}
button1.addActionListener(a);
button2.addActionListener(a);
请注意,此示例仍使用匿名内部类,但如果您愿意,也可以使用命名类。
最后,使用Swing,您可以利用Action
类。 Action
的行为与ActionListener
非常相似,但有许多功能可以在很多情况下简化GUI开发。
答案 1 :(得分:2)
不,当然你不需要创建4个类。您可以简单地创建一个类来处理按钮代码,2个类,或3个或4个类(如果需要),甚至可以使用当前不建议使用的GUI类(this
)。
您的任何内部侦听器类都可以调用GUI类中的方法。
编辑:一个视图控件示例,其中一个控件类用于处理多个按钮:
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class QuickMVC {
private static void createAndShowGui() {
QuickMvcView view = new QuickMvcView();
QuickMvcControl control = new QuickMvcControl();
view.setControl(control);
JFrame frame = new JFrame("QuickMVC");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(view.getMainPanel());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class QuickMvcView {
private JPanel mainPanel = new JPanel();
private QuickMvcControl control;
public QuickMvcView() {
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (control != null) {
control.button1Action(e);
}
}
});
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (control != null) {
control.button2Action(e);
}
}
});
mainPanel.add(button1);
mainPanel.add(button2);
mainPanel.add(new JButton(new AbstractAction("Exit") {
public void actionPerformed(ActionEvent e) {
if (control != null) {
control.exitAction(e);
}
}
}));
}
public JPanel getMainPanel() {
return mainPanel;
}
public void setControl(QuickMvcControl control) {
this.control = control;
}
}
class QuickMvcControl {
public void button1Action(ActionEvent e) {
System.out.println("called from button 1");
}
public void exitAction(ActionEvent e) {
JComponent comp = (JComponent) e.getSource();
Window win = SwingUtilities.getWindowAncestor(comp);
win.dispose();
}
public void button2Action(ActionEvent e) {
System.out.println("called from button 2");
}
}
答案 2 :(得分:1)
附加相同的侦听器类,但根据事件源(单击该按钮)具有不同的实现方法。
您可以考虑使用getSource()来查找发生的对象事件并调用相应的方法。