如何解决我如何使用 Spring Framework 从未在 JavaFX 中分配给它的控制器访问和更改窗格
我的目标是通过对不同控制器中按钮的操作来更改由一个控制器控制的程序主窗口中的中心窗格。我知道我必须在其他控制器中实例化主窗口控制器才能访问主窗口视图,并且我知道我可以将主控制器类自动装配(注入)到不同的控制器中,但是当我这样做时,我得到了所有的 Css 样式和主菜单处于非活动状态,如果没有它,当我尝试使用 MainMenuController 中的 MainController 时会出现 Nullpointer 异常
我有 main.fxml
<?import com.jfoenix.controls.JFXDrawer?>
<?import com.jfoenix.controls.JFXHamburger?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.borderpane?>
<?import javafx.scene.layout.StackPane?>
<StackPane fx:id="rootPane" prefheight="720.0" prefWidth="1280.0" styleClass="root" stylesheets="@../style/dark-theme-contrast.css" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.hrc.backoffice.MainController">
<children>
<AnchorPane accessibleRole="MENU_BUTTON" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefheight="720.0" prefWidth="1280.0" styleClass="root" stylesheets="@../style/dark-theme-contrast.css">
<children>
<borderpane prefheight="720.0" prefWidth="1280.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<left>
<JFXDrawer fx:id="mainMenuDrawer" alignment="CENTER_LEFT" defaultDrawerSize="220.0" prefWidth="0.0" resizableOnDrag="true" stylesheets="@../style/dark-theme-contrast.css" borderpane.alignment="TOP_LEFT" />
</left>
<center>
<AnchorPane fx:id="mainWindowCenterPane" borderpane.alignment="TOP_LEFT">
<children>
<JFXHamburger fx:id="mainMenuHamburger" styleClass="jfx-hamburger-icon" stylesheets="@../style/dark-theme-contrast.css" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="10.0" />
</children>
</AnchorPane>
</center>
</borderpane>
</children>
</AnchorPane>
</children>
这是 MainController.java
public class MainController implements Initializable {
@FXML
private StackPane rootPane;
@FXML
private JFXDrawer mainMenuDrawer;
@FXML
private JFXHamburger mainMenuHamburger;
@FXML
private AnchorPane mainWindowCenterPane;
@Override
public void initialize(URL location,ResourceBundle resources) {
try {
initDrawer();
} catch (IOException e) {
e.printstacktrace();
Logger.getLogger(MainController.class.getName()).log(Level.SEVERE,null,e);
}
}
private void initDrawer() throws IOException {
ScrollPane menuScrollpane = FXMLLoader.load(getClass().getResource("/view/mainMenu.fxml"));
mainMenuDrawer.setSidePane(menuScrollpane);
HamburgerSlideCloseTransition task = new HamburgerSlideCloseTransition(mainMenuHamburger);
task.setRate(-1);
mainMenuHamburger.addEventHandler(MouseEvent.MOUSE_CLICKED,event -> {
mainMenuDrawer.toggle();
});
mainMenuDrawer.setonDraweropening((event) -> {
task.setRate(task.getRate() * -1);
task.play();
mainMenuDrawer.setMinWidth(220);
});
mainMenuDrawer.setonDrawerClosed((event) -> {
task.setRate(task.getRate() * -1);
task.play();
mainMenuDrawer.setMinWidth(0);
});
}
public void setMainWindowCenterPane(AnchorPane mainWindowCenterPane) {
this.mainWindowCenterPane = mainWindowCenterPane;
}
}
这里是 main-menu.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import javafx.scene.control.Accordion?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<ScrollPane fx:id="mainMenuScrollPane" prefheight="720.0" prefWidth="220.0" stylesheets="@../style/dark-theme-contrast.css" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.hrc.backoffice.MainMenuController">
<content>
<VBox fx:id="mainMenuVBox" prefheight="574.0" prefWidth="200.0" stylesheets="@../style/dark-theme-contrast.css">
<children>
<Accordion fx:id="mainMenuAccordion" stylesheets="@../style/dark-theme-contrast.css">
<panes>
<TitledPane fx:id="menuProductMenu" alignment="TOP_RIGHT" contentdisplay="RIGHT" expanded="false" nodeOrientation="RIGHT_TO_LEFT" stylesheets="@../style/dark-theme-contrast.css" text="Меню">
<graphic>
<ImageView fitHeight="25.0" fitWidth="25.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../images/028-menu1.png" />
</image>
</ImageView>
</graphic>
<content>
<VBox prefheight="100.0" prefWidth="216.0" styleClass="titled-pane" stylesheets="@../style/dark-theme-contrast.css">
<children>
<JFXButton fx:id="compositeProductMenu" alignment="BASELINE_RIGHT" buttonType="RAISED" onAction="#initCompositeProductMenu" prefheight="30.0" prefWidth="170.0" text="Блюда" textFill="WHITE">
<font>
<Font size="13.0" />
</font>
</JFXButton>
<JFXButton fx:id="semifinishedProductMenu" alignment="BASELINE_RIGHT" buttonType="RAISED" layoutX="20.0" layoutY="20.0" prefheight="30.0" prefWidth="170.0" text="Полуфабрикаты" textFill="WHITE">
<font>
<Font size="13.0" />
</font>
</JFXButton>
<JFXButton fx:id="compositeProductMenuCategories" alignment="BASELINE_RIGHT" buttonType="RAISED" layoutX="20.0" layoutY="45.0" prefheight="30.0" prefWidth="170.0" text="Категории блюд" textFill="WHITE">
<font>
<Font size="13.0" />
</font>
</JFXButton>
<JFXButton fx:id="productModificators" alignment="BASELINE_RIGHT" buttonType="RAISED" layoutX="10.0" layoutY="60.0" prefheight="30.0" prefWidth="170.0" text="Модификаторы" textFill="WHITE">
<font>
<Font size="13.0" />
</font>
</JFXButton>
</children>
</VBox>
</content>
<font>
<Font name="System Bold Italic" size="14.0" />
</font>
</TitledPane>
</panes>
</Accordion>
</children>
</VBox>
</content>
和 MainMenuController.java
public class MainMenuController implements Initializable {
@FXML
private ScrollPane mainMenuScrollPane;
@FXML
private VBox mainMenuVBox;
@FXML
private Accordion mainMenuAccordion;
@FXML
private TitledPane menuFinances;
@FXML
private TitledPane menuProductMenu;
@FXML
private JFXButton compositeProductMenu;
@FXML
private JFXButton semifinishedProductMenu;
@FXML
private JFXButton compositeProductMenuCategories;
@FXML
private JFXButton productModificators;
@FXML
private TitledPane menuStock;
@FXML
private TitledPane menuProductOperations;
@FXML
private TitledPane menuMarketing;
@FXML
private TitledPane menuCompany;
@FXML
private TitledPane menuStatistics;
@FXML
private TitledPane menuSettings;
MainController mainController;
// @Autowired
// public MainMenuController(MainController mainController) {
// this.mainController = mainController;
// }
@Override
public void initialize(URL location,ResourceBundle resources) {
initCompositeProductMenu();
// compositeProductMenu.setonAction(event -> {
// try {
// AnchorPane productMenuPane = FXMLLoader.load(getClass().getResource("/view/product-menu-list.fxml"));
// mainController.setMainWindowCenterPane(productMenuPane);
// } catch (IOException e) {
// e.printstacktrace();
// }
// });
}
@FXML
private void initCompositeProductMenu() {
compositeProductMenu.addEventHandler(ActionEvent.ACTION,event1 -> {
try {
AnchorPane productMenuPane = FXMLLoader.load(getClass().getResource("/view/product-menu-list.fxml"));
mainController.setMainWindowCenterPane(productMenuPane);
} catch (IOException e) {
e.printstacktrace();
}
});
}
}
以及我想传递给 product-menu-list.fxml 中的主窗口的视图
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXTabPane?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefheight="720.0" prefWidth="1200.0" stylesheets="@../style/dark-theme-contrast.css" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.hrc.backoffice.ProductMenuListController">
<children>
<JFXTabPane prefheight="720.0" prefWidth="1200.0" stylesheets="@../style/dark-theme-contrast.css" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<tabs>
<Tab text="Untitled Tab">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefheight="180.0" prefWidth="200.0">
<children>
<TableView prefheight="691.2000202824526" prefWidth="1200.0000352125912" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn prefWidth="75.0" text="C1" />
<TableColumn prefWidth="75.0" text="C2" />
<TableColumn prefWidth="75.0" text="C1" />
<TableColumn prefWidth="75.0" text="C2" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
<padding>
<Insets top="5.0" />
</padding>
</TableView>
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="Untitled Tab">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefheight="180.0" prefWidth="200.0" />
</content>
</Tab>
<Tab text="Untitled Tab">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefheight="180.0" prefWidth="200.0" />
</content>
</Tab>
</tabs>
</JFXTabPane>
</children>
</AnchorPane>
我知道我必须在其他控制器中实例化主窗口控制器才能访问主窗口视图,并且我知道我可以将主控制器类自动装配(注入)到不同的控制器中,但是当我这样做时,我得到了我所有的 Css样式和主菜单处于非活动状态,如果没有它,我当然会在尝试使用 MainMenuController 中的 MainController 时遇到 Nullpointer 异常。
我从 @Autowired // public MainMenuController(MainController mainController) { // this.mainController = mainController; // }
中得到了什么
完全不活动的白色窗口,只有汉堡小部件可见但不活动
我错过了什么???
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。