前一段时间被要求写一个视图工具用来处理常用的功能。
最终选了使用Swing来开发。
程序开发完突然想到一个问题,如果每次要增加一个小功能,是不是都得在源代码上增加代码,然后打包?
后来就想着增加一个按钮,来导入新的功能。而关注点,只需要开发新的功能,即可。
实现如下:
1、一个通用的JPanel接口
// 抽象类public abstract class AbstractCustomPanel { // 初始化内容面板(即新增功能的视图面板) public abstract CustomPanel initContainer();}// 实体类public abstract class CustomPanel extends JPanel { // 获取类的类名称 public abstract String getPackageName();}
所有的功能小工具的视图都继承 AbstractCustomPanel(也可以写成接口)
面板容器继承 CustomPanel
2、实现一个小功能
public class NotifyInit extends AbstractCustomPanel { public CustomPanel initContainer() { return new NotifyPanel(); }}// 功能视图public class NotifyInit extends AbstractCustomPanel { public NotifyPanel() { // TODO 实现视图效果 } public NotifyPanel getPackageName() { return this.getClass().getName(); }}
3、将上面的小功能打包成jar包(不是可执行的jar包)
4、主程序动态加载此工具类
主菜单加上此工具按钮(我新增了一个导入对话框,内有功能名称,功能包名(实现抽象类的类包名称),功能jar路径(此处应该是一个文件选择对话框),动态加载按钮)
JToggleButton button = new JToggleButoon("功能名称");// jar 文件保存在classes的plugins文件夹内URL url = Thread.currentThread().getContextClassLoader().getResouce("resources/jar名称").toURI().toURL();URLClassLoader classLoader= new URLClassLoader(new URL[] { url }, Thread.currentThread().getContextClassLoader()); Classclazz = classLoader.loadClass("packageName");AbstractCustonPanel custom = clazz.newInstance();// 得到功能工具的视图面板CustomPanel panel = custom.initContainer();String packageName = panel.getPackageName();// 加载到主面板,或作其他操作
4.2