我在 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/