9

我被 javafx 弄湿了。这就是我正在做的事情。

FXML Views
DI Controllers
Weld-SE Managed Services and Models
Trying to confine UI to FXML
Trying keep the Controllers thin

问题:

在尝试编写 UI 代码时,大多数静态 UI 都被限制在 fxml 中。但是在某些情况下,我会发现自己添加、删除、显示、隐藏元素等。

我发现自己在控制器内部执行此操作,因为 fx 允许我在视图中配置控制器方法,它将调用特定的操作/事件。所有这些代码都处理动态 UI 构建/操作,并且属于视图层。但是,它最终导致控制器变胖。

javafx 提供 javascript 集成。这是一种抽象视图操作代码的可能方式。但这会在组合中添加不那么完美的javascript。

如何在 java 或 fxml 中抽象出代码,以免破坏 Thin Controller Paradigm ?

编辑

@assylias

同意,我已经考虑过这种方式,Java 类和 fxml 一起成为可重用的小部件。但是,我如何将它连接到 FXML。FXML 除了控制器什么都不懂。假设我使用 fx:controller 将此视图类连接到 fxml 中,而不是将其命名为控制器。所以我有这样的东西。

在此处输入图像描述

这个视图类只有视图操作代码。然后我会创建另一个控制器类。但后来我希望以某种方式将表单数据填充到这个控制器中。这应该只在用户提交表单时发生。所以在某种程度上,我需要以某种方式告诉 javafx UI 操作请求/事件不同于实际的数据操作请求/事件。

你的想法,对不起,如果它很冗长。我试图用尽可能少的词来表达它。

4

2 回答 2

1

我认为最简单的解决方案是记住 FXML 中指定的控制器是视图控制器。它的目的是包含修改和更新视图的代码,而不是包含传统的 MVC 控制器代码或业务逻辑。

例如,在我目前正在进行的一个项目中,我将 JavaFX 与Akka Actors一起使用。该应用程序是用 scala 编写的。JavaFX 视图控制器包含修改视图所需的任何代码。一个屏幕包含一个登录表单。当用户单击登录按钮时,视图控制器会简单地创建一条包含用户名和密码的消息,并将该消息发送给负责执行业务逻辑的参与者。如果该actor确定存在错误,那么它将向视图控制器发送一条消息,并且视图控制器可以决定需要在屏幕上进行哪些类型的更新。

我发现使用带有 JavaFX 的 akka Actor 可以大大简化应用程序的编码,至少有两个原因。

  1. 因为使用参与者系统要求参与者之间发送消息,所以表示代码和业务代码之间存在自然边界。来回传递的消息形成了这个自然边界。
  2. 使用演员完全取代了使用线程/任务的复杂性。它完全消除了javafx.concurrent.Task为长时间运行的进程编写代码的需要。
于 2014-01-27T17:09:57.573 回答
0

将您的视图操作代码放在 Main Class 中怎么样?

主要课程:

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!");
        }
    }); 
}

控制器 :

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
}
}

缺点:您需要在控制器类中为您想要操作的所有节点获取 getter。

于 2013-02-05T21:05:37.657 回答