Java FX 在上一阶段更改标签



我有非常简单的应用程序(我只想了解控制器切换机制(。第一个窗口显示标签和按钮。单击按钮时,将显示另一个带按钮的窗口。现在,当您单击第二个按钮时,第一个窗口中的标签应该会更改。我在这里读过一些帖子,也尝试了这个Java FX在前一阶段场景中更改标签文本,但是,没有成功。如果你能在这个简单的例子上向我解释一下,也许我将能够更好地理解控制器逻辑。这是我的代码,感谢您的任何帮助:

主控制器,带有要更改的标签和按钮,可打开新窗口

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"));
}

最新更新