当前位置: 首页 > 知识库问答 >
问题:

空指针异常将字符串从一个窗口传递到另一个窗口

乜思淼
2023-03-14

长话短说,我搜索了与我类似的问题,所以我可以“自己”解决这个问题。我在这里和这里找到了这些例子,但没有一个对我有用。

我需要将在第一个窗口的TextField中键入的字符串传递给下一个窗口。

我的主要:

public class Main extends Application{

    /**
     * @param stage
     * @throws java.lang.Exception
     */
     @Override
     public void start(Stage stage) throws Exception {

        FXMLLoader floader = new FXMLLoader();        
        Parent root = FXMLLoader.load(getClass().getResource("java1.fxml"));
        Java1Controller j1 = (Java1Controller)floader.getController();

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.setResizable(false);
        stage.show();

    }


    public static void main(String[] args) {
        launch(args);
    }
}  

当我使用FXML时,这是Window1(java1)的控制器:

    public class Java1Controller implements Initializable {

    @FXML
    private TextField tSend;
    @FXML
    private Button bSend; 


    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

    @FXML
    private void sendText(ActionEvent event) throws IOException {

        FXMLLoader fLd = new FXMLLoader();       

        Parent novo = FXMLLoader.load(getClass().getResource("java2.fxml"));       

        Java2Controller j2 = (Java2Controller)fLd.getController();
        j2.setLbText(tSend.getText());

        Scene novScene = new Scene(novo);     

        Stage novStage = (Stage)((Node)(event.getSource())).getScene().getWindow();                
        novStage.setScene(novScene);
        novStage.setResizable(false);

        novStage.show();
    }  



}

以及Window2的控制器(java2):

    public class Java2Controller implements Initializable {

    @FXML
    private Label lbText;
    @FXML
    private Button bOK;

    /**
     * Initializes the controller class.
     * @param url
     * @param rb
     */

    /**
     * @param string the string to set
     */
    public void setLbText(String string) {
        lbText.setText(string);
    }

    @FXML
    private void closeJPane(ActionEvent event) {

        Stage stage = (Stage)((Node)(event.getSource())).getScene().getWindow();
        stage.close();
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    } 


}

问题指向我用自定义函数(j2.setLbText)设置Text的Java1Controller行。为什么?如果有关系,我用的是Netbeans 8.2和JavaFX Scene Builder 11.0。

FXML Java1:

<Pane maxHeight="252.0" maxWidth="388.0" minHeight="252.0" minWidth="388.0" prefHeight="252.0" prefWidth="388.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.Java1Controller">
   <children>
      <Label layoutX="126.0" layoutY="76.0" text="Insira texto aqui:">
         <font>
            <Font size="16.0" />
         </font>
      </Label>
      <TextField fx:id="tSend" layoutX="109.0" layoutY="102.0" />
      <Button fx:id="bSend" layoutX="169.0" layoutY="178.0" mnemonicParsing="false" onAction="#sendText" text="Send" />
   </children>
</Pane>

FXML Java2:

<Pane maxHeight="388.0" maxWidth="252.0" minHeight="252.0" minWidth="388.0" prefHeight="252.0" prefWidth="388.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.Java2Controller">
   <children>
      <Label fx:id="lbText" layoutX="137.0" layoutY="106.0" text="Texto enviado">
         <font>
            <Font size="16.0" />
         </font>
      </Label>
      <Button fx:id="bOK" layoutX="164.0" layoutY="178.0" mnemonicParsing="false" onAction="#closeJPane" prefHeight="26.0" prefWidth="61.0" text="OK" />
   </children>
</Pane>

共有1个答案

夏炎彬
2023-03-14

您正在使用静态加载方法来加载 fxml。这样,新的 FXMLLoader 实例将由您无法获取引用的方法创建。您自己创建的 FXMLLoader 实例永远不会用于加载 fxml 文件,因此没有控制器可以通过其 get控制器属性使用:

// here you create a loader without setting a location
FXMLLoader fLd = new FXMLLoader();       
// here a static method uses another loader instance to load the fxml
Parent novo = FXMLLoader.load(getClass().getResource("java2.fxml"));       
// here you try to retrieve the controller from the loader instance that is still in the same state as after the constructor completion
Java2Controller j2 = (Java2Controller)fLd.getController();

更改代码并使用您自己创建的加载程序实例加载fxml:

// create loader with location set
FXMLLoader fLd = new FXMLLoader(getClass().getResource("java2.fxml"));

// use loader instance to load fxml from location specified
Parent novo = fLd.load();

// the controller should now be available
Java2Controller j2 = (Java2Controller)fLd.getController();

assert j2 != null
 类似资料:
  • 目前,我已经开始使用Selenium2.0/Web-Driver为我工作的公司进行自动化测试。 目前我已经开发了大约20个测试,但是当我运行这些测试时,它们会为每个测试打开一个新的浏览器窗口。 我在注册测试用例中运行它,然后 在第二个测试用例中运行,我认为应该将焦点放回第一个窗口。 我还使用关闭正在创建的其他窗口,但我希望它们一开始就不打开。

  • 我有两条流: 测量 WhoMeasured(关于谁进行了测量的元数据) 这些是它们的案例类: 流包含大量数据。流几乎没有任何可用性。事实上,对于<code>who_measured_id</code>流中的每个<code>who_。这本质上是一个哈希表,由流填充。 在我的自定义窗口函数中 这是我的工作。现在你可能会看到,有一些东西不见了:两个流的结合。 因此,从本质上讲,这是一种查找表,当流中的新

  • 如何将输出连接到? 在其JList上有一个监听器,以便将选定的行输出到控制台。我怎么能直接输出到输出的? 是否可以触发一个由Main拾取的事件?就足够了吗? Main.java:

  • 这是我的选择 但我得到了这个错误: java.lang.空指针异常:尝试调用接口方法'intjava.util.List.size()'在空对象引用android.app.ActivityThread.perform启动活动(ActivityThread.java:3507)在android.app.ActivityThread.handle启动活动(ActivityThread.java:366

  • 问题内容: 如何将输出连接到? 上有一个侦听器,以便将选定的行输出到控制台。如何将输出定向到JTextPane打开输出? 会引发一个事件Main吗?会的足矣? Main.java: 问题答案: 这是一个使用观察者模式的示例,。请注意,也有可能收听组合的模型。

  • 我知道有很多关于这个的问题,但没有一个能解决我的问题我想把一个字符串变量从一个片段传递给另一个片段,这是我做的代码。但是我得到了错误(我会显示错误) 从我做的第一个片段 我喜欢的第二个片段 我犯了这样的错误