
在进行JavaFX系列的开发中,我们经常容易遇到许多让人烦躁的问题:
1. JavaFX FXML开发过于死板
2. 程序多个页面管理繁杂,难以统一管理与调度
3. 单个初始化执行代码片段特别长,使每个方法看起来非常的笨重且丑陋
4. 后续单个功能的实现:增加、删除、查找都显得极为耗时,哪怕做好了分类的准备,寻找也是大海捞针
5. 程序逻辑死板,即使是优化也只能想到通过类似工厂的策略来低效的解决各种功能,甚至不同功能还要单独的建立工厂类
6. 如果程序支持第三方开发,或者支持内部再开发,会导致开发人员吃力不讨好,且程序项目代码需要频繁的进行修改。
7. 程序样式难以修改
那么上面我提出了这么多问题,EventBus策略是如何帮助我解决这个难题的呢?它是如何帮助我开发一个精致、高维护、问题快排查的程序的呢?

本帖子并不是在否认MVC架构下JavaFx的合理性,本帖只是为广大开发者提供一份程序的设计思路,为XDM的FX开发提供便捷!以下说法不只限制于JavaFX一项技术,但是重点围绕此技术探讨。
在开始之前,我要提出第一个激进的观点,即:JavaFX开发除非必要,否则请拒绝使用FXML进行开发!
相信说到这个观点,可能就有人要疑惑了,欸,楼主楼主,你不是说单个初始化执行代码片段特别长吗?FXML改善了这一点,可你还在说它长,你为什么现在又要一脚把他踢开呢?
FXML让我们可以像Html一样快速便捷的开发一个应用程序,这点不能否认,但是FXML以及Jar的特性就导致其资源上的安全性难以保证,诞生的一系列问题:诸如文件丢失、文件篡改、容易被用来对程序的逆向功能等等。
JavaFX的Pane中虽然拥有类似document.querySelector的能力,但面向这些key或者说fx:id来开发内心还是有些心虚。
Java语言的优势与劣势都是强类型语言,如果每次获取一个值都要判断它是否为null,是否为正确类型。我认为这就是在平添麻烦。
这是我们的主角EventBus就登场了,我们可以设想一些场景:你使用JavaFX编写了一个文本编辑器程序(此程序还未开源,将来将会进行开源处理)

此时可以看此编辑器的工具栏目应该有一些扩展功能,像是打开文件所在位置、设置字体大小等功能。
我这里就不演示其他的创建和添加方式,只演示使用了EventBus(发布者---监听者)后,程序是如何便捷实现的!
假设在此之前我们以及通过其他行为拥有了工具栏这个Pane的对象,那么我们可以先创建一个事件源对象来储存它,这个对象大致长这样

为了防止人疑惑,record关键字是Java高版本新增加的记录类,功能类似lombok的Get注解,可以自动生成对应的获取方法。
如果还是难以理解,你可以将上面的代码看成:
public class EditorTabCreateEvent {
private final EditorApp.FileTab fileTab;
public EditorTabCreateEvent(EditorApp.FileTab fileTab) {
this.fileTab = fileTab;
}
public EditorApp.FileTab getFileTab() {
return fileTab;
}
}
这里我创建了EditorTabCreateEvent类,并实现了一个空的接口BaseEvent来证明自己是一个事件。
这样我们就有了一个对象的载体,有了载体,就得有创建的地方,我们可以在需要进行菜单初始化的地方进行事件的传播
eventBus.dispatch(new EditorTabCreateEvent(tab));
这样我们就可以在任意地方获取到这个事件本身了,使用事件监听注解@EventListener(listener = EditorTabCreateEvent.class)指定此事件的监听,然后在方法内处理此事件即

显示的效果如下:

如果你认为每个组件都写在一个方法里还是无法解决代码段过长的问题,那么就可以多写几个,上方多出来的内容就是由三个此事件的订阅者添加的新的工具
/**
* 用于修改辅助解析的文件类型工具
*/
@EventListener(listener = EditorTabCreateEvent.class)
public static void pushAceModeUtil(EditorTabCreateEvent event) {}
/**
* 显示当前页面文字大小的工具
*/
@EventListener(listener = EditorTabCreateEvent.class)
public static void pushFontSizeUtil(EditorTabCreateEvent event) {}
怎么样,是不是显得非常的好用?它将每个部分都分成了若干个订阅者,让他们的增加变得简单易懂。
单个功能需要修改,由于独立性很高,所以也不会产生代码耦合的情况
唉,篇幅太长了,草草结尾吧!不过通过上面的文章你应该能有所体会它的妙用了,只要大量的使用,完全可以解决之前提出的所有问题。
所有的EventBus都能解决以上的痛点,最后夹带点私货,附上我写的EventBus的异常报错部分。
他能让我们瞬间定位报错的来源方便进行分析。

上面的报错是EventBus出来的,在两个黄色框内可以看到出现异常的事件,与发生错误的地点。
还可以定义异常处理器,当任意事件处理时出现了异常都会调用异常处理器来处理,如果没有一个处理器处理(调用helloWorld.cancel();),则会像图上那样抛出异常。
当异常处理器出现异常也会有详细的报错截图,不会产生死循环

最后如果有人想要我写的这个EventBus的源码和依赖可以在楼下发言。
如果有人想更多的了解EventBus在JavaFX中的应用,也可以在楼下说出来,倒时我会开个新的帖子。
重振社区荣光,我辈义不容辞!最近打算升级7后申请吧主,请各位多多支持!