controller 和 main 之间的 javafx 通信

javafx communication between controller and main

为什么我想获取控制器时,下面的代码总是在控制台显示null

RenewCardFXML2_controller controller=loader.getController();

当我按下按钮时控制台打印 null

我有两个控制器,想使用来自主应用程序(会员卡)的文本字段-txt_numberOfCard_GENERAL 在第二个 fxml 文件中有自己的控制器。

来自第二个控制器的

txt_numberOfCard_GENERAL.getText 命令并使用它的值。

 /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package membershipcards;

import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.SplitPane;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import membershipcards.RenewCardFXML2_controller;

/**
 *
 * @author Primary
 */
public class mainGUIController implements Initializable {

    @FXML
    private ImageView logoimg;
    @FXML
    private SplitPane splitMenuContent;
    @FXML
    private Button btnCards;
    @FXML
    private Button btnRenewCard;
    @FXML
    private Button bntNewClient;
    @FXML
    private Button btnEditCard;
    @FXML
    private Button btnStatistics;
    @FXML
    private AnchorPane detailsPane;
    @FXML
    private Button btnCardN;
    @FXML
    public TextField txt_numberOfCard_GENERAL;
    @FXML
    public TextField txt_memberName_GENERAL;

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


    }    

    @FXML
    private void loadCardsFXML1(ActionEvent event) {
        try {
            detailsPane = (AnchorPane) FXMLLoader.load(getClass().getResource("CardsFXML1.fxml"));
        } catch (IOException ex) {
            Logger.getLogger(mainGUIController.class.getName()).log(Level.SEVERE, null, ex);
        }
        splitMenuContent.getItems().set(1, detailsPane);
    }

    @FXML
    private void loadRenewCardFXML2(ActionEvent event)throws IOException {
        FXMLLoader loader = new FXMLLoader();
        detailsPane = (AnchorPane) loader.load(getClass().getResource("RenewCardFXML2.fxml"));
        splitMenuContent.getItems().set(1, detailsPane);

        RenewCardFXML2_controller controller=loader.getController();

        controller.setMGC(this);

        System.out.println(controller);         
    }
}

您调用的FXMLLoader.load(URL)方法是static方法。因此,您没有在您创建的 FXMLLoader 实例 上调用 load,并且由于该实例尚未加载 FXML,因此它尚未初始化其 controller 字段。

(好的 IDE 会在 loader.load(...) 行中警告您从非静态上下文或类似的东西调用静态方法。例如,Eclipse 说 "The static method load(URL) should be accessed in a static way.")

以下将起作用:

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("RenewCardFXML2.fxml"));
detailsPane = loader.load();
splitMenuContent.getItems().set(1, detailsPane);

RenewCardFXML2_controller controller=loader.getController();

请注意,您可以将该代码块的前两行缩减为一行

FXMLLoader loader = new FXMLLoader(getClass().getResource("RenewCardFXML2.fxml"));
detailsPane = loader.load();