Ben*_*Ben 2 java swing jcomponent extend jbutton
首先-很抱歉,没有代码太可怕,只是我要解释的框架。它运行没有错误。
目标
我正在为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();
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
HandlerA.java
是按钮单击的随机处理程序的样本。后来,有可能是HandlerB
,HandlerC
等
package gui;
// A random handler
public class HandlerA {
public void init() {
System.out.println("Button clicked.");
}
}
Run Code Online (Sandbox Code Playgroud)
首先十分感谢!
你们所有的处理程序都应该实现like之类的接口Clickable
。这样,接口就可以指定init函数的存在:
public interface Clickable
{
public void init();
}
Run Code Online (Sandbox Code Playgroud)
进行HandlerA定义:
public class HandlerA implements Clickable {
public void init() {
System.out.println("Button clicked.");
}
}
Run Code Online (Sandbox Code Playgroud)