我正在用javafx弄湿我的脚.这就是我在做的事情.
FXML Views
DI Controllers
Weld-SE Managed Services and Models
Trying to confine UI to FXML
Trying keep the Controllers thin
Run Code Online (Sandbox Code Playgroud)
问题:
在尝试编写UI时,大多数静态UI都被限制在fxml中.但有些情况下,我发现自我添加,删除,显示,隐藏元素等.
我发现自己在控制器内执行此操作,因为fx允许我在视图中配置控制器方法,它将调用特定的操作/事件.所有这些代码都涉及动态UI构建/操作,属于视图层.但是,它最终会在控制器中使控制器变胖.
javafx提供了javascript集成.这是一种可能的方法来抽象出那个视图的manupulation代码.但这会增加不太完美的javascript.
我如何在java或fxml中抽象出代码,这样我就不会破坏Thin Controller Paradigm?
编辑
@assylias
同意,我已经考虑过这种方式,这样java类和fxml一起成为一个可重用的小部件.但是,我如何将其连接到FXML.FXML除了控制器之外什么都不懂.假设我使用fx:controller将此视图类连接到fxml中,而不是将其命名为控制器.所以我有这样的事情.

此视图类只有视图操作代码.然后我会创建另一个控制器类.但后来我希望以某种方式将表单数据填充到此控制器中.这应该仅在用户提交表单时发生.所以在某种程度上,我需要以某种方式告诉javafx UI操作请求/事件与实际数据操作请求/事件不同.
你的想法,对不起,如果它是冗长的.试图用尽可能少的语言表达出来.
将视图操作代码放在主类中怎么样?
主要类别:
public class SampleJavaFXApp extends Application{
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource(
"SampleUI.fxml"));
Parent root = (Parent) loader.load();
Controller controller = loader.getController();
viewManipulationLogic(controller);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
// view manipulation logic
private void viewManipulationLogic(Controller controller) {
controller.getBlueButton().setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
System.out.println(" I am just about button!");
}
});
}
Run Code Online (Sandbox Code Playgroud)
控制器 :
public class Controller implements Initializable {
@FXML
private Button blueButton;
public Button getBlueButton() {
return blueButton;
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
//real data manipulation
}
}
Run Code Online (Sandbox Code Playgroud)
缺点:在控制器类中,您需要为要操作的所有节点提供吸气剂。