薄控制器

Sha*_*jun 9 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
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操作请求/事件与实际数据操作请求/事件不同.

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

inv*_*ant 0

将视图操作代码放在主类中怎么样?

主要类别:

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)

缺点:在控制器类中,您需要为要操作的所有节点提供吸气剂。