Java 前一阶段外汇更改标签
Java FX change label in previous stage
我有一个非常简单的应用程序(我只是想了解控制器切换机制)。首先 window 显示标签和按钮。当您单击该按钮时,将显示另一个 window 按钮。现在,当您单击第二个按钮时,第一个 window 中的标签应该会更改。我在这里阅读了一些帖子,也尝试了这个,但是没有成功。如果你能用这个简单的例子向我解释,也许我就能更好地理解控制器逻辑。这是我的代码,感谢您的帮助:
带有要更改标签的 PrimaryController 和打开新按钮的按钮 window
public class PrimaryController implements Initializable {
@FXML
private Label label;
@FXML
private Button btnButton;
@Override
public void initialize(URL url, ResourceBundle rb) {
btnButton.setOnAction((event) -> {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("secondaryFXML.fxml"));
Parent root = loader.load();
loader.<SecondaryController>getController().setPrimaryController(this);
Stage stage = new Stage();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
} catch (IOException ex) {
Logger.getLogger(PrimaryController.class.getName()).log(Level.SEVERE, null, ex);
}
});
}
public void setLabelText(String string){
label.setText(string);
}
}
带有更改标签按钮的辅助控制器
public class SecondaryController implements Initializable {
@FXML
private Button btnChangeLabel;
private PrimaryController primary;
@Override
public void initialize(URL url, ResourceBundle rb) {
btnChangeLabel.setOnAction((event) -> {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("primaryFXML.fxml"));
loader.load();
PrimaryController primaryCtrl = loader.<PrimaryController>getController();
primaryCtrl.setLabelText("eres");
} catch (IOException ex) {
Logger.getLogger(SecondaryController.class.getName()).log(Level.SEVERE, null, ex);
}
});
}
public void setPrimaryController(PrimaryController primary){
this.primary = primary;
}
}
在按钮的操作事件处理程序中,您将再次加载 FXML 文件(创建其中定义的所有控件的新实例)并获取新 UI 的控制器。然后,您在控制器上为 UI 调用 setLabelText(...)
,更改新创建的标签中的文本。您从未显示过从 FXML 文件加载的 UI,因此这不会产生任何可见的效果。
当然,您实际上并不需要所有控件的新实例:您(大概)想要更改已显示的标签文本。您已经将对现有 PrimaryController
实例的引用传递给 SecondaryController
实例,因此只需调用 setLabelText(...)
即可:
@Override
public void initialize(URL url, ResourceBundle rb) {
btnChangeLabel.setOnAction((event) ->
primary.setLabelText("eres"));
}
我有一个非常简单的应用程序(我只是想了解控制器切换机制)。首先 window 显示标签和按钮。当您单击该按钮时,将显示另一个 window 按钮。现在,当您单击第二个按钮时,第一个 window 中的标签应该会更改。我在这里阅读了一些帖子,也尝试了这个
带有要更改标签的 PrimaryController 和打开新按钮的按钮 window
public class PrimaryController implements Initializable {
@FXML
private Label label;
@FXML
private Button btnButton;
@Override
public void initialize(URL url, ResourceBundle rb) {
btnButton.setOnAction((event) -> {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("secondaryFXML.fxml"));
Parent root = loader.load();
loader.<SecondaryController>getController().setPrimaryController(this);
Stage stage = new Stage();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
} catch (IOException ex) {
Logger.getLogger(PrimaryController.class.getName()).log(Level.SEVERE, null, ex);
}
});
}
public void setLabelText(String string){
label.setText(string);
}
}
带有更改标签按钮的辅助控制器
public class SecondaryController implements Initializable {
@FXML
private Button btnChangeLabel;
private PrimaryController primary;
@Override
public void initialize(URL url, ResourceBundle rb) {
btnChangeLabel.setOnAction((event) -> {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("primaryFXML.fxml"));
loader.load();
PrimaryController primaryCtrl = loader.<PrimaryController>getController();
primaryCtrl.setLabelText("eres");
} catch (IOException ex) {
Logger.getLogger(SecondaryController.class.getName()).log(Level.SEVERE, null, ex);
}
});
}
public void setPrimaryController(PrimaryController primary){
this.primary = primary;
}
}
在按钮的操作事件处理程序中,您将再次加载 FXML 文件(创建其中定义的所有控件的新实例)并获取新 UI 的控制器。然后,您在控制器上为 UI 调用 setLabelText(...)
,更改新创建的标签中的文本。您从未显示过从 FXML 文件加载的 UI,因此这不会产生任何可见的效果。
当然,您实际上并不需要所有控件的新实例:您(大概)想要更改已显示的标签文本。您已经将对现有 PrimaryController
实例的引用传递给 SecondaryController
实例,因此只需调用 setLabelText(...)
即可:
@Override
public void initialize(URL url, ResourceBundle rb) {
btnChangeLabel.setOnAction((event) ->
primary.setLabelText("eres"));
}