两个控制器类之间的JavaFX通信[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

对于我的JavaFX应用程序,我无法将数据从一个控制器类传输到另一个控制器类。我花了4天时间试图找到解决方案但没有成功。将会感激任何和所有建议,因为我真的不知道接下来要尝试什么。 在尝试从表中的整行获取数据之前,我只是尝试在标签中设置文本。

先感谢您。

UPDATE

移动Parent root = fxmlLoader.load();

上图:ManageUserController manageUserController = fxmlLoader.getController();对我有意义,我仍然收到相同的NullPointerExcepetion,现在只触发:manageUserController.setData("Test Text");

更新2

固定!基本上,这是因为每个场景在加载应用程序时已经初始化,因此无法写入fxml文件。

// testController.java
package home;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

public class testcontroller implements Initializable {

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    public void switchscenes(MouseEvent mouseEvent) {
        try {

            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("manage-user.fxml"));
            Parent root = fxmlLoader.load(); 
            ManageUserController manageUserController = fxmlLoader.getController();

//    
       manageUserController.userdetails(tblAllUsers.getSelectionModel().getSelectedItem().getFirstname());



     //////////// WHERE MY CODE BREAKS /////////
            manageUserController.setData("Test Text");
            System.err.println("before loading");



            //Method for testing purposes for moving between Scene
            Stage stage = new Stage();
            stage.setScene(new Scene(root));
            stage.setTitle("");
            stage.show();

//            Method for testing purposes for moving between Scene
//            Node node = (Node) mouseEvent.getSource();
//            Stage stage = (Stage)node.getScene().getWindow();
//            stage.close();
//
//            Scene scene = new Scene(FXMLLoader.load(getClass().getResource("Staff_Menu.fxml")));
//            stage.setScene(scene);
//            stage.show();

//            How I normally move between Scenes (Have a seperate library)
//        Scene_Library.SwitchToManageUser();
//        System.err.println("Transferring To User Manager Scene");


        } catch (IOException e) {
            e.printStackTrace();
        }

//        All ready Tried
//        String data = "Hello World!";

//        FXMLLoader loader = new FXMLLoader(getClass().getResource("manage-user.fxml"));
//        try {
//           loader.load();
//        } catch (IOException e) {
//            //e.printStackTrace();
//            System.err.println(e);
//
//        }
//        ManageUserController controller = new ManageUserController();
//        controller.setData(data);

//        Scene_Library.SwitchToManageUser();
//        System.err.println("Transferring To User Manager Scene");
    }
}

// ManageUserController.java
package home;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;

import java.net.URL;
import java.util.ResourceBundle;

public class ManageUserController implements Initializable {
    private MemberObject currentMember;
    Logger logger = Logger.getLogger(getClass().getName());
    public Label lblUsernameID;
    @FXML
    public Label lblName;
    @FXML
    public Button btnUpdateUser;
    @FXML
    public Button btnUserBookings;
    @FXML
    public Button btnManageMembership;
    @FXML
    public Button btnDeleteMember;
    @FXML
    public Button btnBack;
    @FXML
    public Button btnSignOut;

    public void setCurrentMember(MemberObject currentMember){
        logger.log(Level.INFO, currentMember.firstname);
        logger.log(Level.INFO, currentMember.lastname);
        logger.log(Level.INFO, currentMember.email);
        this.currentMember = currentMember;
        this.lblUsernameID.setText((currentMember.getEmail()));
        this.lblName.setText(currentMember.getFirstname() + " " + currentMember.getLastname());
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }
}


//////// FXML File i'm trying to write data too ////////

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<AnchorPane fx:id="parent" style="-fx-background-color: transparent;" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="home.ManageUserController">
    <children>
        <HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #F05F5C;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <children>
                <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" HBox.hgrow="ALWAYS">
                    <children>
                        <Label text="Manage Member" textAlignment="CENTER" textFill="WHITE">
                            <font>
                                <Font size="24.0" />
                            </font>
                            <VBox.margin>
                                <Insets bottom="10.0" />
                            </VBox.margin>
                        </Label>
<!--                        <ImageView fitHeight="64.0" fitWidth="64.0" pickOnBounds="true" preserveRatio="true">0-->
<!--                            <image>-->
<!--                                <Image url="@../images/icons/logo/beach100.png" />-->
<!--                            </image>-->
<!--                        </ImageView>-->
                        <HBox style="-fx-border-color: white; -fx-background-radius: 0;">
                            <VBox.margin>
                                <Insets left="50.0" right="50.0" top="10.0" />
                            </VBox.margin>
                            <children>
                        <Label fx:id="lblUsernameID" prefHeight="31.0" prefWidth="206.0" text="Username ID" textFill="WHITE" HBox.hgrow="ALWAYS">
                           <padding>
                              <Insets left="10.0" />
                           </padding>
                        </Label>
                                <Button mnemonicParsing="false" prefHeight="31.0" style="-fx-background-color: transparent;" HBox.hgrow="ALWAYS">
                                    <graphic>
                                        <ImageView fitHeight="24.0" fitWidth="24.0" pickOnBounds="true" preserveRatio="true">
                                            <image>
                                                <Image url="@../images/icons/accnt/account.png" />
                                            </image>
                                        </ImageView>
                                    </graphic>
                                </Button>
                            </children>
                        </HBox>
                        <HBox style="-fx-border-color: white; -fx-background-radius: 0;">
                            <children>
                        <Label fx:id="lblName" prefHeight="31.0" prefWidth="206.0" text="First and Last Name" textFill="WHITE" HBox.hgrow="ALWAYS">
                           <padding>
                              <Insets left="10.0" />
                           </padding>
                        </Label>
                                <Button mnemonicParsing="false" prefHeight="31.0" style="-fx-background-color: transparent;" HBox.hgrow="ALWAYS">
                                    <graphic>
                                        <ImageView fitHeight="24.0" fitWidth="24.0" pickOnBounds="true" preserveRatio="true">
                                            <image>
                                                <Image url="@../images/icons/mrmbership/user.png" />
                                            </image>
                                        </ImageView>
                                    </graphic>
                                </Button>
                            </children>
                            <VBox.margin>
                                <Insets left="50.0" right="50.0" top="10.0" />
                            </VBox.margin>
                        </HBox>
                    </children>
                </VBox>
                <VBox alignment="CENTER" prefWidth="250.0" style="-fx-background-color: #26283c;">
                    <children>
                        <HBox alignment="CENTER" style="-fx-background-color: #2b2a4c;">
                            <VBox.margin>
                                <Insets left="20.0" right="20.0" top="20.0" />
                            </VBox.margin>
                            <padding>
                                <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                            </padding>
                            <children>
                                <Button fx:id="btnUpdateUser" mnemonicParsing="false" prefHeight="25.0" prefWidth="196.0" style="-fx-background-color: transparent; -fx-text-fill: white;" text="Update Details" HBox.hgrow="ALWAYS" />
                                <ImageView fitHeight="24.0" fitWidth="24.0" pickOnBounds="true" preserveRatio="true">
                                    <image>
                                        <Image url="@../images/icons/general/baseline_settings_white_18dp.png" />
                                    </image>
                                </ImageView>
                            </children>
                        </HBox>
                        <HBox alignment="CENTER" style="-fx-background-color: #2b2a4c;">
                            <padding>
                                <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                            </padding>
                            <children>
                                <Button fx:id="btnUserBookings" mnemonicParsing="false" prefHeight="25.0" prefWidth="196.0" style="-fx-background-color: transparent; -fx-text-fill: white;" text="Bookings" HBox.hgrow="ALWAYS" />
                                <ImageView fitHeight="24.0" fitWidth="24.0" pickOnBounds="true" preserveRatio="true">
                                    <image>
                                        <Image url="@../images/icons/mrmbership/user.png" />
                                    </image>
                                </ImageView>
                            </children>
                            <VBox.margin>
                                <Insets left="20.0" right="20.0" top="10.0" />
                            </VBox.margin>
                        </HBox>
                        <HBox alignment="CENTER" style="-fx-background-color: #2b2a4c;">
                            <padding>
                                <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                            </padding>
                            <children>
                                <Button fx:id="btnManageMembership" mnemonicParsing="false" prefHeight="25.0" prefWidth="196.0" style="-fx-background-color: transparent; -fx-text-fill: white;" text="Manage Membership" HBox.hgrow="ALWAYS" />
                                <ImageView fitHeight="24.0" fitWidth="24.0" pickOnBounds="true" preserveRatio="true">
                                    <image>
                                        <Image url="@../images/icons/mrmbership/usergold.png" />
                                    </image>
                                </ImageView>
                            </children>
                            <VBox.margin>
                                <Insets left="20.0" right="20.0" top="10.0" />
                            </VBox.margin>
                        </HBox>
                  <HBox alignment="CENTER" style="-fx-background-color: #2b2a4c;">
                     <padding>
                        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                     </padding>
                     <children>
                        <Button fx:id="btnDeleteMember" mnemonicParsing="false" prefHeight="25.0" prefWidth="196.0" style="-fx-background-color: transparent; -fx-text-fill: white;" text="Detele Member" HBox.hgrow="ALWAYS" />
                        <ImageView fitHeight="24.0" fitWidth="24.0" pickOnBounds="true" preserveRatio="true">
                           <image>
                              <Image url="@../images/icons/general/baseline_close_white_18dp.png" />
                           </image>
                        </ImageView>
                     </children>
                     <VBox.margin>
                        <Insets left="20.0" right="20.0" top="10.0" />
                     </VBox.margin>
                  </HBox>
                  <HBox alignment="CENTER">
                     <padding>
                        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                     </padding>
                     <children>
                        <Button fx:id="btnBack" mnemonicParsing="false" prefHeight="32.0" prefWidth="140.0" style="-fx-background-color: transparent; -fx-text-fill: white;" text="Back" HBox.hgrow="ALWAYS">
                           <HBox.margin>
                              <Insets left="5.0" />
                           </HBox.margin>
                        </Button>
                        <Button fx:id="btnSignOut" mnemonicParsing="false" prefHeight="32.0" prefWidth="140.0" style="-fx-background-color: transparent; -fx-text-fill: white;" text="Sign Out" />
                     </children>
                     <VBox.margin>
                        <Insets left="20.0" right="20.0" top="10.0" />
                     </VBox.margin>
                  </HBox>
                    </children>
                    <HBox.margin>
                        <Insets />
                    </HBox.margin>
                </VBox>
            </children>
        </HBox>
    </children>
    <opaqueInsets>
        <Insets />
    </opaqueInsets>
</AnchorPane>





// MY ERROR LOG

/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=60327:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/lib/tools.jar:/Users/jack/Dropbox/University/Coventry/year-2/260CT/Dev/Proto/out/production/Proto:/Users/jack/Documents/db-derby-10.14.2.0-bin/lib/derby.jar:/Users/jack/Documents/db-derby-10.14.2.0-bin/lib/derbyclient.jar:/Users/jack/Documents/db-derby-10.14.2.0-bin/lib/derbynet.jar:/Users/jack/Documents/db-derby-10.14.2.0-bin/lib/derbytools.jar:/Users/jack/Documents/mysql-connector-java-8.0.15.jar home.Main
Login Successful
Transferred to Home Page
Transferring to New test table
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
    at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$358(GlassViewEventHandler.java:432)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    ... 28 more
Caused by: java.lang.NullPointerException
    at home.ManageUserController.setData(ManageUserController.java:30)
    at home.testcontroller.switchscenes(testcontroller.java:94)
    ... 38 more

java javafx controller fxml fxmlloader
1个回答
1
投票

您需要在获取控制器之前加载。

所以称之为,

Parent root = fxmlLoader.load();

在你打电话之前,

ManageUserController manageUserController = fxmlLoader.getController();
© www.soinside.com 2019 - 2024. All rights reserved.