【发布时间】:2017-02-06 23:52:59
【问题描述】:
我在 JavaFX 中有一个应用程序,它具有带有菜单和工具栏的主场景,以及在按下菜单按钮之一后注入到该主场景中的较小场景。
现在,HomeCntroller 负责任一场景组件:主场景(带有工具栏和菜单)和注入场景。如果注入的场景数量超过一个,这将导致我创建庞大、庞大且非常不专业的控制器。
如何拆分控制器职责?
现在我的控制器看起来像这样: changeDashboardPane 方法将较小的窗格注入到我的主 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
有什么想法吗?
【问题讨论】:
-
拥有一个将控制权传递给为每个窗格指定的控制器的全局控制器是我的第一个想法。虽然这对我来说看起来不错。
-
您可以将其他 FXML 元素插入您的主 fxml 并保持控制器分开。我想这可能是你想要做的。你看过stackoverflow.com/questions/19342259/…吗?
-
每个 FXML 文件都应该有一个控制器类。因此,如果您需要将其拆分为更小的组件,请将视图拆分为更小的 FXML 文件并为每个文件创建一个控制器类。使用
<fx:include>等 -
好的,我发现,我可以从 FXML 加载的任何窗格都可以有自己的控制器,即使该窗格被注入另一个窗格。这解决了我的问题:) 谢谢大家的回答! :)
-
它必须有自己的控制器
标签: java design-patterns javafx