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();
为什么我想获取控制器时,下面的代码总是在控制台显示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();