JavaFx 如何避免创建一个巨大的 Controller

标签 java design-patterns javafx

我在 JavaFX 中有一个应用程序,它具有带菜单和工具栏的主场景,以及在按下其中一个菜单按钮后注入(inject)到该主场景中的较小场景。

现在,HomeCntroller 负责任一场景组件:Home Scene(带有工具栏和菜单)和注入(inject)场景。如果注入(inject)的场景数量超过一个,这会导致我创建庞大、庞大且非常不专业的 Controller 。

如何拆分 Controller 责任?

现在我的 Controller 看起来像这样: changeDashboardPane 方法将较小的 Pane 注入(inject)到我的主 HomePane 中。

@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);
    }

}

为了让这个更清楚,屏幕:

without injected second pane with injected second pane

有什么想法吗?

最佳答案

我建议您将主场景分成较小的场景,例如您可以有一个工具场景、一个标题场景、一个内容场景等等。那么你应该为每个场景配备一个 Controller 。

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

我希望它很清楚并且可以提供帮助!

关于JavaFx 如何避免创建一个巨大的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757014/

相关文章:

java - 奇怪的 JPA 行为,初始化字段为空

php - 使用 php 从类对象查询数据库

C# 设计模式 - 如何根据高度可配置的用户选择编写代码

java - 这个简单工厂是否违反了开闭原则?

java - 如何在打开新场景时运行 JavaFX 中的方法

JDialog 中的 javax.swing.Timer 在关闭 JDialog 时不会停止

java - 如何在 IBatis 的选择查询中发送一个列表?

java - 在 Java 文件中实现 HTML

JavaFX 应用程序 - 架构问题 - 继承类的不同列表

JavaFX 将一个形状拖放到另一个形状上