JavaFX正在从另一个控制器更新控制器属性

JavaFX正在从另一个控制器更新控制器属性,java,javafx,controller,scenebuilder,Java,Javafx,Controller,Scenebuilder,我有一个进度条,我正试图在控制器的javaFX中更新它。我正在基于名为Generate()的函数更新进度条,如果调用该函数,则应更新主控制器内的进度条。但是,我的代码并没有更新它,而是更新了进度条的一个新实例 my DroperContentController中的生成方法是: try { AnchorPane ap = fxmlLoader.load(); for(Node node: ap.getChildren()){ if(node.getId()

我有一个进度条,我正试图在控制器的javaFX中更新它。我正在基于名为Generate()的函数更新进度条,如果调用该函数,则应更新主控制器内的进度条。但是,我的代码并没有更新它,而是更新了进度条的一个新实例

my DroperContentController中的生成方法是:

    try {
    AnchorPane ap = fxmlLoader.load();
    for(Node node: ap.getChildren()){
        if(node.getId().equals("progressBar")){
            progressBar = (ProgressBar) node;
            progressBar.setProgress(50);
        }
    }

} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
在我的主控制器中,我使用scene builder通过fxml设置了progressBar,我试图从DroperContentController更新progressBar,它本质上是一个边栏菜单,由3个按钮组成,其中一个按钮是调用generate()方法的generate。我知道我应该使用线程,我是JavaFX的初学者,仍然在学习如何充分使用它

我也试过:

FXMLLoader fxmlLoader = new FXMLLoader((getClass().getResource("layout.fxml")));
然后声明控制器并通过

FXMLDocumentController fxmldc = fxmlLoader.getController();
然后评估财产,但是我用这种方法得到了npe

我的FXMLDocumentController

@Override
public void initialize(URL arg0, ResourceBundle arg1) {
    //Load Splash screen
    if (!MainClass.isSplashLoaded)
        loadSplashScreen();

    //load drawer content
    try {
        VBox box = FXMLLoader.load(getClass().getResource("drawerContent.fxml"));
        drawer.setSidePane(box);

        HamburgerBasicCloseTransition transition = new HamburgerBasicCloseTransition(hamburger);
        transition.setRate(-1);
        hamburger.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> {
            transition.setRate(transition.getRate() * -1);
            transition.play();

            if (drawer.isShown()) {
                drawer.close();
                mainText.setVisible(true);
            } else {
                drawer.open();
                mainText.setVisible(false);
            }

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

只需在
DrawerContentController
中为进度创建一个可观察属性:

public class DrawerContentController implements Initializable {

    private final DoubleProperty progress = new SimpleDoubleProperty();

    public DoubleProperty progressProperty() {
        return progress ;
    }

    public final double getProgress() {
        return progressProperty().get();
    }

    public final void setProgress(double progress) {
        progressProperty().set(progress);
    }

    // existing code...

}
现在,您可以将进度条的进度属性绑定到控制器的进度属性:

@Override
public void initialize(URL arg0, ResourceBundle arg1) {
    //Load Splash screen
    if (!MainClass.isSplashLoaded)
        loadSplashScreen();

    //load drawer content
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("drawerContent.fxml"));
        VBox box = loader.load();

        DrawerContentController drawerContentController = loader.getController();
        progressBar.progressProperty().bind(drawerContentController.progressProperty());

        drawer.setSidePane(box);

        // ... existing code
    }

    // ...
}

现在,在您的
DrawerContentController
类中,如果执行
this.setProgress(…)
(更新您定义的新进度属性),它将自动更新进度条。

锚定窗格以及其中的进度条将永远不会显示。因此,更改进度条的progress属性将不会产生可见的效果。FXMLLoader FXMLLoader=new FXMLLoader((getClass().getResource(“layout.fxml”));fxmldc1=fxmlLoader.getController();fxmldc1.setProgress(50);在第二个代码块中,您从未实际加载FXML,因此控制器将为null。我尝试了FXMLLoader FXMLLoader=new FXMLLoader();fxmlLoader.load(getClass().getResource(“layout.fxml”);fxmldc1=fxmlLoader.getController();fxmldc1.setProgress(50);但这将创建一个新实例,而不是从我所看到的更新现有实例。在这种情况下,您将调用静态
fxmlLoader.load(URL)
方法。因此控制器仍然不会在
fxmlLoader
实例中初始化。您需要
fxmlLoader fxmlLoader=new fxmlLoader(URL);
然后
AnchorPane ap=fxmlLoader.load();
fxmldc1=fxmlLoader.getController()
。但是,正如您所说,在您尝试的初始代码块中仍然存在相同的问题:控制器连接到一个未显示的锚定窗格。非常感谢!!,我现在要通过谷歌搜索。接受答案