Java 精简控制器
我的脚被javafx弄湿了。这就是我正在做的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允许我在视图中配置控制器方法,它将在特定的操
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结合使用大大简化了应用程序的编码,至少有两个原因
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
}
}