如何将 FXML ComboBox 实例从一个控制器传递到另一个控制器?

贝利亚姆

我正在制作一个 JavaFX 应用程序。我很难将组合框实例从一个屏幕传递到另一个屏幕。我的 ComboBox 变量称为 reportBox。它在 home.fxml 中定义并注入到 MyController.java 中。当我尝试在 MyController 中切换屏幕时,我正在创建一个 ReportScene 对象(我创建的类)并在报告场景的构造函数中传递 ComboBox。Report Scene 也在加载report.fxml。

在使用代码来完成这项工作时,我要么在尝试设置 reportScenebox 的项目时出错,要么我不会出错但 Combobox 将为空(所以它似乎没有得到传递的引用) . 最终,如果我说reportSceneBox = MyController.SceneBox,我不应该直接设置reportscene box的项目。我有时根据代码的迭代得到的错误是:ReportScene.reportBox = MyController.ReportBox,我得到“线程“JavaFX 应用程序线程”java.lang.NullPointerException 中的“异常”。

我不明白为什么会发生这个错误,或者为什么没有从 Mycontroller.reportbox 正确填充/复制 reportSceneBox。有人可以帮助解释或帮助解决此问题吗?谢谢你。

我的控制器

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.MenuItem;
import javafx.scene.input.MouseEvent;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;


public class MyController {

    private final static String[] REPORT_TYPES = {"Sales Report", "Inventory Report", "Guacamole Metrics"};


    @FXML
    private ComboBox<String> reportBox;

    private ObservableList<String> items = FXCollections.observableArrayList(REPORT_TYPES);


    public static final String[] getReportTypes()
    {
        return REPORT_TYPES;
    }

    /**
     * Initializes the controller class. This method is automatically called
     * after the fxml file has been loaded.
     */
    @FXML
    public void initialize()
    {
        //initialized drop down of report types
        reportBox.setItems(items);

        //Handles reportBox event
        reportBox.setOnAction((ActionEvent event) -> {
            String inputReport = reportBox.getValue();
            int reportIndex = indexOf(inputReport); //is do while loop here useful for input validation. it might not be, but something to consider. 
            if( reportIndex > -1)
            {
                System.out.println(reportIndex);
                ReportScene rs = new ReportScene(reportIndex, this.reportBox);
                //MATCH FOUND, create report scene;
            }
            else
            {
                // NO MATCH FOUND. NEED NEW INPUT.
            }
            // if input is valid, create new Report Scene of given REPORT_TYPE
            System.out.println(reportBox.getValue());
        });


    }

    private int indexOf(String reportType)
    {
        int index = -1;
        for(int i = 0; i < REPORT_TYPES.length; i++)
        {
            if(reportType.equalsIgnoreCase(REPORT_TYPES[i]))
            {
                index = i;
                i = REPORT_TYPES.length + 2;
            }
        }

        return index;
    }

主页.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuButton?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.SeparatorMenuItem?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>


<?import javafx.scene.control.ComboBox?>
<?import javafx.collections.FXCollections?>
<?import java.lang.String?>


<VBox prefHeight="600.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MyController">
  <children>
    <MenuBar VBox.vgrow="NEVER">
      <menus>
        <Menu mnemonicParsing="false" text="File">
          <items>
            <MenuItem mnemonicParsing="false" text="New" />
            <MenuItem mnemonicParsing="false" text="Open…" />
            <Menu mnemonicParsing="false" text="Open Recent" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Close" />
            <MenuItem mnemonicParsing="false" text="Save" />
            <MenuItem mnemonicParsing="false" text="Save As…" />
            <MenuItem mnemonicParsing="false" text="Revert" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Preferences…" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Quit" />
          </items>
        </Menu>
        <Menu mnemonicParsing="false" text="Edit">
          <items>
            <MenuItem mnemonicParsing="false" text="Undo" />
            <MenuItem mnemonicParsing="false" text="Redo" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Cut" />
            <MenuItem mnemonicParsing="false" text="Copy" />
            <MenuItem mnemonicParsing="false" text="Paste" />
            <MenuItem mnemonicParsing="false" text="Delete" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Select All" />
            <MenuItem mnemonicParsing="false" text="Unselect All" />
          </items>
        </Menu>
        <Menu mnemonicParsing="false" text="Help">
          <items>
            <MenuItem mnemonicParsing="false" text="About Report Generator" />
          </items>
        </Menu>
      </menus>
    </MenuBar>
    <AnchorPane maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" id="pane">
      <children>
        <Label alignment="CENTER" layoutX="271.0" layoutY="26.0" style="&#10;" text="" textAlignment="CENTER" textFill="#9f9f9f" wrapText="false">
          <font>
            <Font size="18.0" />
          </font>
        </Label>
            <!-- <DatePicker layoutX="390.0" layoutY="44.0" />
            <DatePicker layoutX="189.0" layoutY="44.0" />
            <MenuButton layoutX="43.0" layoutY="44.0" mnemonicParsing="false" text="MenuButton">
              <items>
                <MenuItem mnemonicParsing="false" text="Sales Report 1" onAction="#processReport1" fx:id="menuItem1"/>
                <MenuItem mnemonicParsing="false" text="Inventory Report 1" />
                <MenuItem mnemonicParsing="false" text="InOut Report 1" />
              </items>
            </MenuButton> -->
            <Button layoutX="43.0" layoutY="317.0" mnemonicParsing="false" text="Run" />
            <ComboBox layoutX="43.0" layoutY="44.0" prefWidth="150.0" promptText="Select a Report" fx:id="reportBox" editable="True" >
              <items>
                <FXCollections fx:factory="observableArrayList">

                </FXCollections>
              </items>
            </ComboBox>
      </children>
    </AnchorPane>
  </children>
</VBox>

ReportScene.java

import java.util.Arrays;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;



public class ReportScene {

    private int reportIndex;
    private final String[] reportTypes = MyController.getReportTypes();
    private Scene reportScene;
    @FXML
    private ComboBox<String> reportSceneBox;
    private Button homeBtn;

    private final double[] reportWidths = new double[reportTypes.length];
    private final double[] reportHeights = new double[reportTypes.length];


    public ReportScene()
    {
        System.out.println("Default constructor for report scene");
    }

    public ReportScene(int reportIndex, ComboBox<String> reportBox)
    {
        //reportTypes = MyController.REPORT_TYPES;//getReportTypes();
        //destroy old scene and generate new one
        //destroy old scene here

        this.reportIndex = reportIndex;
        this.reportSceneBox = reportBox;
        //ObservableList<String> items = FXCollections.observableArrayList(MyController.getReportTypes());

        //this.reportSceneBox.setItems(items);
        //this.reportBox.setVisible(true);
        //this.homeBtn = new Button
        Arrays.fill(reportWidths, Main.getHomeWidth());
        Arrays.fill(reportHeights, Main.getHomeHeight());
        this.generateScene();
    }

    //@FXML
    public void generateScene()
    {
        try
        {
            Parent newRoot = FXMLLoader.load(getClass().getClassLoader().getResource("Reports/" + reportTypes[this.reportIndex] + ".fxml"));
            //newRoot.getChildrenUnmodifiable().add(this.reportBox);
            //newRoot.getParent().get

            Stage stageInstance = Main.getPrimaryStage();
//          @SuppressWarnings("unchecked")
//          ComboBox<String> ap = (ComboBox<String>) newRoot;
//          ap.getChildren().add(this.reportBox);
//          ap.setLayoutY(-580.0);
//          this.reportBox.setVisible(true);
            this.reportScene = new Scene(newRoot,reportWidths[this.reportIndex],reportHeights[this.reportIndex]);
            //this.reportScene.
            reportScene.getStylesheets().addAll(this.getClass().getResource("application.css").toExternalForm());
            stageInstance.setScene(this.reportScene);
            stageInstance.show();
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }

报告.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.SeparatorMenuItem?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<?import javafx.scene.control.ComboBox?>
<?import javafx.collections.FXCollections?>
<?import java.lang.String?>

<VBox prefHeight="600.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ReportScene">
  <children>
    <MenuBar VBox.vgrow="NEVER">
      <menus>
        <Menu mnemonicParsing="false" text="File">
          <items>
            <MenuItem mnemonicParsing="false" text="New" />
            <MenuItem mnemonicParsing="false" text="Open…" />
            <Menu mnemonicParsing="false" text="Open Recent" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Close" />
            <MenuItem mnemonicParsing="false" text="Save" />
            <MenuItem mnemonicParsing="false" text="Save As…" />
            <MenuItem mnemonicParsing="false" text="Revert" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Preferences…" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Quit" />
          </items>
        </Menu>
        <Menu mnemonicParsing="false" text="Edit">
          <items>
            <MenuItem mnemonicParsing="false" text="Undo" />
            <MenuItem mnemonicParsing="false" text="Redo" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Cut" />
            <MenuItem mnemonicParsing="false" text="Copy" />
            <MenuItem mnemonicParsing="false" text="Paste" />
            <MenuItem mnemonicParsing="false" text="Delete" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Select All" />
            <MenuItem mnemonicParsing="false" text="Unselect All" />
          </items>
        </Menu>
        <Menu mnemonicParsing="false" text="Help">
          <items>
            <MenuItem mnemonicParsing="false" text="About MyHelloApp" />
          </items>
        </Menu>
      </menus>
    </MenuBar>
    <AnchorPane id="pane" maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
      <children>
        <Label alignment="CENTER" layoutX="384.0" layoutY="28.0" style="&#10;" text="Sales Report" textAlignment="CENTER" textFill="#9f9f9f" wrapText="false">
          <font>
            <Font size="18.0" />
          </font>
        </Label>
            <DatePicker layoutX="229.0" layoutY="91.0" />
            <DatePicker layoutX="464.0" layoutY="91.0" />
            <Label layoutX="229.0" layoutY="67.0" text="Start Date" />
            <Label layoutX="464.0" layoutY="67.0" text="End Date" />
            <Button fx:id="Run" layoutX="49.0" layoutY="496.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="49.0" text="Run" />
            <ComboBox layoutX="43.0" layoutY="44.0" prefWidth="150.0" promptText="Select a Report" fx:id="reportSceneBox" editable="True" >
              <items>
                <FXCollections fx:factory="observableArrayList">
                </FXCollections>
              </items>
            </ComboBox>
            <!--  <Button fx:id="Home" layoutX="49.0" layoutY="41.0" mnemonicParsing="false" text="Home" /> -->
      </children>
    </AnchorPane>
  </children>
</VBox>
布莱克·奥德威

当您newRootgenerateScene()方法中创建时,传递给构造函数的组合框将被“覆盖” 您创建您的newRoot,然后将其用作您正在显示的新场景的视图——这就是为什么您的组合框是空的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将模型从一个控制器传递到另一个

来自分类Dev

如何将数据从一个视图控制器传递到另一个SWIFT

来自分类Dev

如何将数据从一个视图控制器传递到另一个SWIFT

来自分类Dev

如何将响应从一个控制器传递到另一个?

来自分类Dev

如何将数据从一个视图控制器传递到另一个?

来自分类Dev

如何将数据从一个视图控制器传递到另一个视图控制器,并且在视图控制器之间有一个显示视图控制器

来自分类Dev

如何将值从一个控制器传递到ASP.Net MVC3中的另一个控制器

来自分类Dev

从AngularJS如何将数据从一个控制器+模板传递到另一个控制器+模板?

来自分类Dev

在我的情况下,如何将数据从一个控制器传递到另一个控制器

来自分类Dev

如何将 NSMutableDictionary 从一个视图控制器传递到另一个视图控制器?

来自分类Dev

如何将脆弱数据(例如连接字符串)从一个控制器传递到另一个控制器

来自分类Dev

如何从另一个Java类(意味着在控制器之外)更改.fxml文件的标签文本?

来自分类Dev

如何将对象数组从一个控制器传递到另一个?

来自分类Dev

将变量的值从控制器传递到另一个控制器

来自分类Dev

如何从一个控制器到另一个控制器共享阵列

来自分类Dev

如何在 Rails 中将控制权从一个控制器传递到另一个控制器?

来自分类Dev

如何通过重定向URL将模型属性对象的值从一个控制器传递到另一个控制器

来自分类Dev

如何在CakePHP 3中将数据从一个控制器传递到另一个控制器?

来自分类Dev

如何将对象列表从一个控制器传递到另一控制器?

来自分类Dev

将控制权从一个控制器传递到另一控制器

来自分类Dev

将特定数据从一个控制器传递到另一个

来自分类Dev

将NSManagedObject从一个视图控制器传递到另一个

来自分类Dev

Rails-将参数从一个视图传递到另一个控制器

来自分类Dev

将“用户”对象从一个视图控制器传递到另一个

来自分类Dev

Rails 4将参数从一个控制器传递到另一个

来自分类Dev

似乎无法将数据从一个控制器传递到另一个

来自分类Dev

Javafx将参数和值从一个控制器传递到另一个

来自分类Dev

Rails 4将参数从一个控制器传递到另一个

来自分类Dev

将NSManagedObject从一个视图控制器传递到另一个

Related 相关文章

  1. 1

    将模型从一个控制器传递到另一个

  2. 2

    如何将数据从一个视图控制器传递到另一个SWIFT

  3. 3

    如何将数据从一个视图控制器传递到另一个SWIFT

  4. 4

    如何将响应从一个控制器传递到另一个?

  5. 5

    如何将数据从一个视图控制器传递到另一个?

  6. 6

    如何将数据从一个视图控制器传递到另一个视图控制器,并且在视图控制器之间有一个显示视图控制器

  7. 7

    如何将值从一个控制器传递到ASP.Net MVC3中的另一个控制器

  8. 8

    从AngularJS如何将数据从一个控制器+模板传递到另一个控制器+模板?

  9. 9

    在我的情况下,如何将数据从一个控制器传递到另一个控制器

  10. 10

    如何将 NSMutableDictionary 从一个视图控制器传递到另一个视图控制器?

  11. 11

    如何将脆弱数据(例如连接字符串)从一个控制器传递到另一个控制器

  12. 12

    如何从另一个Java类(意味着在控制器之外)更改.fxml文件的标签文本?

  13. 13

    如何将对象数组从一个控制器传递到另一个?

  14. 14

    将变量的值从控制器传递到另一个控制器

  15. 15

    如何从一个控制器到另一个控制器共享阵列

  16. 16

    如何在 Rails 中将控制权从一个控制器传递到另一个控制器?

  17. 17

    如何通过重定向URL将模型属性对象的值从一个控制器传递到另一个控制器

  18. 18

    如何在CakePHP 3中将数据从一个控制器传递到另一个控制器?

  19. 19

    如何将对象列表从一个控制器传递到另一控制器?

  20. 20

    将控制权从一个控制器传递到另一控制器

  21. 21

    将特定数据从一个控制器传递到另一个

  22. 22

    将NSManagedObject从一个视图控制器传递到另一个

  23. 23

    Rails-将参数从一个视图传递到另一个控制器

  24. 24

    将“用户”对象从一个视图控制器传递到另一个

  25. 25

    Rails 4将参数从一个控制器传递到另一个

  26. 26

    似乎无法将数据从一个控制器传递到另一个

  27. 27

    Javafx将参数和值从一个控制器传递到另一个

  28. 28

    Rails 4将参数从一个控制器传递到另一个

  29. 29

    将NSManagedObject从一个视图控制器传递到另一个

热门标签

归档