Java FX在前一阶段更改标签

时间:2017-05-25 14:25:51

标签: javafx controller fxml

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

带有要更改标签的PrimaryController和用于打开新窗口的按钮

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

}

1 个答案:

答案 0 :(得分:0)

在按钮的操作事件处理程序中,您再次加载FXML文件(创建其中定义的所有控件的新实例)并获取新UI的控制器。然后在控制器上为该UI调用setLabelText(...),更改新创建的标签中的文本。您还没有显示从FXML文件加载的UI,因此没有明显的效果。

当然,您实际上并不想要所有控件的新实例:您(可能)想要更改已显示的标签文本。您已将对现有PrimaryController实例的引用传递给SecondaryController实例,因此只需在其上调用setLabelText(...)

@Override
public void initialize(URL url, ResourceBundle rb) {
    btnChangeLabel.setOnAction((event) ->             
        primary.setLabelText("eres"));
}