Java 精简控制器

Java 精简控制器,java,javafx-2,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允许我在视图中配置控制器方法,它将在特定的操

我的脚被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中的代码抽象出来,这样就不会破坏瘦控制器范式

编辑

@assylias

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

这个视图类只有视图操作代码。然后我将创建另一个控制器类。但是我希望能够以某种方式将表单数据填充到这个控制器中。只有当用户提交表单时,才会发生这种情况。所以在某种程度上,我需要告诉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!");
        }
    }); 
}

缺点:在控制器类中,所有要操作的节点都需要getter。

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

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

我发现将akka actors与JavaFX结合使用大大简化了应用程序的编码,至少有两个原因

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

  • 您可以使用FXML视图,一个Java视图(控制器的第一层)来执行动态操作,然后是一个适当的Java控制器,它扩展了第一层。(不确定这是否行得通,只是一个想法)。您似乎试图应用MVC模式,但大多数场景并不需要它。JavaFX中的控制器不是您已经了解到的MVC模式的控制器(图中的视图类)。那么你想解决什么问题呢?你能提供一个例子吗?我希望找到如何更好地组织我的代码,避免代码混乱。我想其他人一定在我之前就遇到过这个问题,并且一定找到了解决办法。你能告诉我们你有什么样的代码混乱问题吗?我认为即使在MainClass中,这也不合适,但它适用于一个视图可能是的简单应用程序。但是,如果您有多个FXML文件,这会失控并很快变得混乱。
    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
    }
    }