微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何使用 Spring Framework 从未在 JavaFX 中分配给它的控制器访问和更改窗格

如何解决我如何使用 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; // } 中得到了什么

完全不活动的白色窗口,只有汉堡小部件可见但不活动

我错过了什么???

Project Structure

Effect

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。