【问题标题】:Java FX change label in previous stage前一阶段的 Java FX 更改标签
【发布时间】:2017-05-25 22:32:57
【问题描述】:

我有一个非常简单的应用程序(我只是想了解控制器切换机制)。第一个窗口显示标签和按钮。单击按钮时,将显示另一个带有按钮的窗口。现在,当您单击第二个按钮时,第一个窗口中的标签应该会更改。我在这里阅读了一些帖子,也尝试了这个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;
}

}

【问题讨论】:

  • 您链接的帖子的答案不是已经解释了吗? “但是在 getController 之前调用 load 将无济于事,因为 fxml 只是使用不同的控制器实例再次加载。”
  • 那我该怎么办?因为我很困惑
  • 我正在为主窗口加载控制器,然后我尝试使用 setPrimaryController not load() 方法将该加载的控制器传递到另一个窗口。但是,它似乎不起作用
  • “它似乎不起作用”是什么意思?
  • 什么都没有发生,标签没有改变

标签: javafx controller fxml


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答,但不幸的是,这对我不起作用:(
  • @Mr.Crow “不工作”不是问题陈述。会发生什么?
  • 控制台中没有任何内容,程序的行为就像没有代码设置为在单击按钮时运行。
  • @Mr.Crow 我假设您的意思是您在事件处理程序中添加了System.out.println(...),但什么也没看到。这表明您的 FXML 文件有问题。 initialize() 方法是否被调用?
  • 分配给 fxml 文件的控制器错误 - 我已更改控制器名称但未在 fxml 文件中引用。现在可以了
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2015-08-11
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多