首先 - 对代码墙感到抱歉,但这并不太可怕,只是我试图解释的框架。它运行没有错误。
目标
我正在为我的 GUI 制作一个可重复使用的按钮类,并且每个按钮对象在单击时都需要具有不同的处理程序。我想为ClickHandler
每个新按钮分配一个对象。然后,按钮将调用init()
处理程序,并继续执行。不幸的是,有一个打字问题,因为每个处理程序类都有不同的名称。
现在的进展
现在,处理程序的类型为HandlerA
,但我想让它处理任何名称,如“SettingsHandler”或“GoToTheWahWah”等。
我尝试过使用泛型类型,但由于我是新手,并且来自 webdev 背景,我似乎一直在克服一个概念上的障碍。这是解决问题的正确方法吗?
编码
ReuseableButton.java
是一个可重用的类,唯一改变的是点击时的动作:
package gui;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class ReuseableButton extends JButton implements ActionListener {
private static final long serialVersionUID = 1L;
// I want a generic type here, not just HandlerA!
private HandlerA ClickHandler;
// Assemble generic button
public ReuseableButton(Container c, String s) {
super(s);
addActionListener(this);
c.add(this);
}
// Once again, generic type, not just HandlerA!
public void SetClickHandler(HandlerA ch) {
ClickHandler = ch;
}
// Call init() from whatever class has been defined as click handler.
public void actionPerformed(ActionEvent e) {
ClickHandler.init();
}
}
Controller.java
触发框架并根据需要组装按钮(现在只有一个按钮)。
package gui;
import javax.swing.*;
import java.awt.*;
public class Controller extends JFrame {
private static final long serialVersionUID = 1L;
public Controller() {
JFrame frame = new JFrame("Handler Test GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = frame.getContentPane();
pane.setLayout(new FlowLayout());
ReuseableButton b = new ReuseableButton(pane,"Reuseable Button A");
// THE QUESTION IS HERE: Pass a generic object?
b.SetClickHandler(new HandlerA());
frame.pack();
frame.setSize(200,200);
frame.setVisible(true);
}
public static void main(String args[]) {
new Controller();
}
}
HandlerA.java
是按钮单击的随机处理程序示例。之后,可能会有HandlerB
,HandlerC
等。
package gui;
// A random handler
public class HandlerA {
public void init() {
System.out.println("Button clicked.");
}
}
首先十分感谢!