【发布时间】:2022-11-16 22:23:48
【问题描述】:
我在处理大量节点的 JavaFX 程序中有一个控制器类。我创建了一个方法addEventListeners,它看起来像:
cleanButton.setOnAction(e -> {
...
});
advSett.setOnAction(e -> {
...
});
imageLoaderItem.setOnAction(e -> {
...
});
outputButton.setOnAction(e -> {
...
});
对于控制器处理的每个元素,依此类推。 这个方法占用了 300 行代码,使得控制器类非常混乱。我想知道,是否有更简洁的方式来添加听众?
【问题讨论】:
-
每个听众都做同样的事情吗?然后只需定义一个包含侦听器的变量并将其作为参数传递。如果它不一样但有一个模式,您可以创建一个方法来返回侦听器的变体。如果它们都不同,您显然必须在某处为每个代码编写代码。您使用的 lambda 语法已经非常简洁(对于 Java)。
-
您可以执行多种操作,具体取决于您的事件处理程序逻辑的确切性质。除了@Jorn 的(优秀)建议外,您还可以通过为每个操作定义方法来使代码(也许)更整洁,然后将注册设为单行(例如
cleanButton.setOnAction(e -> clean());)或直接引用这些方法来自 FMXL。如果操作密切相关,这也会有所帮助:private void processNumericInput(int value) { ... }和button1.setOnAction(e -> processNumericInput(1));等。 -
如果问题真的只是您拥有大量控件,请考虑将 FXML 分解为更小的、逻辑上不同的 FXML 文件,每个文件都有自己的控制器。