JavaFX 从另一个控制器更新控制器 属性
JavaFX updating controller property from another controller
我有一个进度条,我正尝试在控制器的 javaFX 中更新它。我正在根据名为 Generate() 的函数更新进度条,如果调用它,它应该更新主控制器内的进度条。但是,我的代码并没有更新它,而是更新了进度条的一个新实例。
我的 DrawerContentController 中的生成方法是:
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();
}
在我的主控制器中,我使用场景生成器通过 fxml 设置了进度条,我正在尝试从 DrawerContentController 更新进度条,它本质上是一个由 3 个按钮组成的侧边栏菜单,其中一个是生成按钮调用 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
class中,如果你this.setProgress(...)
(更新你定义的新进度属性),它会自动更新进度条。
我有一个进度条,我正尝试在控制器的 javaFX 中更新它。我正在根据名为 Generate() 的函数更新进度条,如果调用它,它应该更新主控制器内的进度条。但是,我的代码并没有更新它,而是更新了进度条的一个新实例。
我的 DrawerContentController 中的生成方法是:
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();
}
在我的主控制器中,我使用场景生成器通过 fxml 设置了进度条,我正在尝试从 DrawerContentController 更新进度条,它本质上是一个由 3 个按钮组成的侧边栏菜单,其中一个是生成按钮调用 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
class中,如果你this.setProgress(...)
(更新你定义的新进度属性),它会自动更新进度条。