Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFx如何避免创建一个大型控制器_Java_Design Patterns_Javafx - Fatal编程技术网

JavaFx如何避免创建一个大型控制器

JavaFx如何避免创建一个大型控制器,java,design-patterns,javafx,Java,Design Patterns,Javafx,我在JavaFX中有一个应用程序,它有一个带有菜单和工具栏的主场景,还有一些较小的场景,这些场景在按下一个菜单按钮后被注入到这个主场景中 现在,HomeCntroller负责任一场景组件:带有工具栏和菜单的主场景,以及注入的场景。如果注入的场景数量超过一个,这就导致我创建了大量、巨大且非常不专业的控制器 如何划分控制者责任 现在,我的控制器如下所示: changeDashboardPane方法将较小的窗格注入到我的主主主窗格中 @Component @RequiredArgsConstructo

我在JavaFX中有一个应用程序,它有一个带有菜单和工具栏的主场景,还有一些较小的场景,这些场景在按下一个菜单按钮后被注入到这个主场景中

现在,HomeCntroller负责任一场景组件:带有工具栏和菜单的主场景,以及注入的场景。如果注入的场景数量超过一个,这就导致我创建了大量、巨大且非常不专业的控制器

如何划分控制者责任

现在,我的控制器如下所示: changeDashboardPane方法将较小的窗格注入到我的主主主窗格中

@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired) )
public class HomeController extends AbstractController {
    private static final Logger LOG = Logger.getLogger(HomeController.class);

    private final BudgetProfileService budgetProfileService;

    @FXML
    private Label usernameLabel;

    @FXML
    private ComboBox<String> budgetProfilesComboBox; 

    @FXML
    private AnchorPane dashBoardPane;

    @FXML
    public void initialize() {
        refreshUsernameLabel();
        getAllBudgetProfiles();
        changeDashboardPane(PaneFactoryKeys.FINANCES_PANE);
    }

    private void refreshUsernameLabel() {
        String username = UserAccountProvider.getLoggedUser().getUsername();
        usernameLabel.setText(username);
    }

    private void getAllBudgetProfiles() {
        List<String> budgetProfileNames = budgetProfileService.getAllBudgetProfileNames();
        if (!budgetProfileNames.isEmpty()) {
            budgetProfilesComboBox.getItems().clear();
            budgetProfilesComboBox.getItems().addAll(budgetProfileNames);
        }
    }

    @FXML
    public void handleFinancesButtonAction() {
        changeDashboardPane(PaneFactoryKeys.FINANCES_PANE);
    }

    @FXML
    public void handlePeriodButtonAction() {
        changeDashboardPane(PaneFactoryKeys.PERIOD_PANE);
    }

    @FXML
    public void handleStatisticsButtonAction() {
        changeDashboardPane(PaneFactoryKeys.STATISTICS_PANE);
    }

    @FXML
    public void handleSettingsButtonAction() {
        changeDashboardPane(PaneFactoryKeys.SETTINGS_PANE);
    }

    private final void changeDashboardPane(String paneFactoryKey) {
        double injectedPanePosition = 0.0;
        Pane paneToChange = getPaneFromFactory(paneFactoryKey);
        dashBoardPane.getChildren().clear();
        AnchorPane.setTopAnchor(paneToChange, injectedPanePosition);
        dashBoardPane.getChildren().add(paneToChange);
    }

}
要更清楚地了解这一点,请使用以下屏幕:


有什么想法吗,伙计们

创建多个控制器,多个FXML文件-要继续我之前提供给您的答案,每个具有单独FXML文件的视图也都有

fx:controller="appplication.ExampleViewController"
附加到它。因此,您要做的是创建前面提到的主控制器,它基本上是封装控件以更改动态容器的框架容器。如果您的应用程序非常丰富,并且在一个控制器中具有许多功能,您可以进一步分解视图:

例如,取出菜单并将其放入单独的控制器中,然后用主控制器将其插入主视图中

/与方法setView中的方法相同/

,你所做的只是把它拿走以保持控制器代码更小,你不会以这种方式减少/增加场景图,没有缺点,这只是个人喜好

你最终会得到更多的fxml文件和控制器。这和你之前的问题一样,不需要额外的代码,你可以重用已经提供的代码


控制器之间的数据通过模型传递。-查看更多MVC不要在控制器中处理应用程序数据只关心视图或将它们从/传递到模型中创建多个控制器,多个FXML文件-要继续我之前提供给您的答案,具有单独FXML文件的每个视图也有

fx:controller="appplication.ExampleViewController"
附加到它。因此,您要做的是创建前面提到的主控制器,它基本上是封装控件以更改动态容器的框架容器。如果您的应用程序非常丰富,并且在一个控制器中具有许多功能,您可以进一步分解视图:

例如,取出菜单并将其放入单独的控制器中,然后用主控制器将其插入主视图中

/与方法setView中的方法相同/

,你所做的只是把它拿走以保持控制器代码更小,你不会以这种方式减少/增加场景图,没有缺点,这只是个人喜好

你最终会得到更多的fxml文件和控制器。这和你之前的问题一样,不需要额外的代码,你可以重用已经提供的代码


控制器之间的数据通过模型传递。-深入了解MVC不要在控制器中处理应用程序数据只关心视图或将它们从模型中传递到模型中我建议您将主场景划分为较小的场景,例如,您可以有一个工具场景、一个标题场景、一个内容场景等等。然后,每个场景都应该有一个控制器

之后,我将使用发布者-订阅者模式来处理行为,例如,当您按下场景设置上的按钮时,它会触发其他场景侦听的事件,然后它们会相应地处理该事件并更改其状态


我希望这是明确的,可以帮助

我建议您将主场景划分为较小的场景,例如,您可以有一个工具场景、一个标题场景、一个内容场景等等。然后,每个场景都应该有一个控制器

之后,我将使用发布者-订阅者模式来处理行为,例如,当您按下场景设置上的按钮时,它会触发其他场景侦听的事件,然后它们会相应地处理该事件并更改其状态


我希望这是明确的,可以帮助

为了避免一个庞大的控件类,因为我使用了多个选项卡,所以我将这些选项卡拆分为单个java文件

我的解决方案是创建一个级联类:

基本:包含外汇类型的所有DEF 表1扩展了基础:表1实现 Tab2扩展了Tab1:Tab2的实现 控制器扩展Tab2实现可初始化:实现initializeURL url,ResourceBundle ResourceBundle 重要: 必须在当前选项卡或之前定义任何访问的对象。 Base中的任何对象在控制器中都可用,而在Base、Tab1或Tab2中没有可访问的控制器对象


请随意添加您的意见作为评论或提交改进。

为了避免一个庞大的控件类,因为我使用多个选项卡,我将选项卡拆分为单个java文件

我的解决方案是创建一个级联类:

基地:公司 n训练外汇类型的所有DEF 表1扩展了基础:表1实现 Tab2扩展了Tab1:Tab2的实现 控制器扩展Tab2实现可初始化:实现initializeURL url,ResourceBundle ResourceBundle 重要: 必须在当前选项卡或之前定义任何访问的对象。 Base中的任何对象在控制器中都可用,而在Base、Tab1或Tab2中没有可访问的控制器对象


请随意添加您的意见作为评论或提交改进。

我的第一个想法是使用一个全局控制器,将控制权传递给为每个窗格指定的控制器。虽然我觉得这很好,但您可以将其他FXML元素插入到主FXML中,并将控制器分开。我想这可能是你想要做的。你看过了吗?每个FXML文件应该只有一个控制器类。因此,如果需要将视图拆分为更小的组件,请将视图拆分为更小的FXML文件,并为每个文件创建一个控制器类。使用等等。我发现,我可以从FXML加载的任何窗格都可以有自己的控制器,即使该窗格被注入到另一个窗格中。这就解决了我的问题:谢谢你们的回答它必须有自己的控制器有一个全局控制器,将控制权传递给为每个窗格指定的控制器是我的第一个想法。虽然我觉得这很好,但您可以将其他FXML元素插入到主FXML中,并将控制器分开。我想这可能是你想要做的。你看过了吗?每个FXML文件应该只有一个控制器类。因此,如果需要将视图拆分为更小的组件,请将视图拆分为更小的FXML文件,并为每个文件创建一个控制器类。使用等等。我发现,我可以从FXML加载的任何窗格都可以有自己的控制器,即使该窗格被注入到另一个窗格中。这就解决了我的问题:谢谢你们的回答它必须有自己的控制器,我有HomeScene,有空的仪表板空间,还有注入HomeScene的更小的窗格。现在每个窗格都有自己的控制器,一切都很好:是的,我有HomeScene,有空的仪表板空间,还有更小的窗格被注入HomeScene。现在每个窗格都有自己的控制器,一切都很好: