薄控制器

时间:2013-02-05 18:17:21

标签: java javafx-2

我正在用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集成。这是一种可能的方法来抽象出那个视图的manupulation代码。但这会增加不太完美的javascript。

我如何在java或fxml中抽象出代码,这样我才不会破坏Thin Controller范例?

修改

@assylias

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

enter image description here

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

你的想法,对不起,如果它是冗长的。试图用尽可能少的语言表达出来。

2 个答案:

答案 0 :(得分:1)

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

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

我发现使用带JavaFX的akka​​ actor极大地简化了应用程序的编码,至少有两个原因。

  1. 因为使用actor系统要求在actor之间发送消息,所以表示代码和业务代码之间存在自然界限。来回传递的消息构成了这个自然边界。
  2. 使用actor完全取代了使用线程/任务的复杂性。它完全消除了为长时间运行的进程编写javafx.concurrent.Task代码的需要。

答案 1 :(得分: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。