当前位置: 首页 > 知识库问答 >
问题:

上一阶段的Java FX更改标签

高迪
2023-03-14

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

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个答案

姚俊材
2023-03-14

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

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

@Override
public void initialize(URL url, ResourceBundle rb) {
    btnChangeLabel.setOnAction((event) ->             
        primary.setLabelText("eres"));
}
 类似资料:
  • 我正在经历一个非常奇怪的行为,我怀疑这是JavaFX9 API中的一个bug,但我很谨慎,因为我更有可能遗漏了一些东西。 MCVE: 它给我带来的问题是,我无法为窗口大小/位置实现健壮的首选项保存,因为在Linux上,窗口会爬行。(场景宽度/高度可以作为一种变通方法,但仍然可疑。)

  • 我正在使用Netbeans 7.2和Scene Builder1.0开发一个JavaFX应用程序。我有我的主屏幕设置,我想有它,所以我点击一个按钮,它将关闭主窗口和打开另一个。主Stage对象位于main类中,但controller类是独立的,不能访问它,因为它不是静态的,并且位于不同的类中。我如何改变场景或舞台?

  • 我希望javafx标签自动更新为正在输入到文本字段中的内容,目前我只有在单击回车键时才更改它。我正在使用秋千和javafx的混合。 这可能吗? 谢谢

  • 我需要更改JavaFX中标签的锚点。我将锚点描述为选择来翻译底层节点的点。默认情况下,锚点似乎是左上角。 我试图通过如下描述的附加翻译来解决这个问题: 代码应转换标签,使其像右下角的锚点一样工作。这不起作用,因为在我执行代码时,标签的边界框是[minX:0.0,minY:0.0,minZ:0.0,宽度:-1.0,高度:-1.0,深度:0.0,maxX:-1.0,maxY:-1.0,maxZ:0.0

  • 我正在尝试为用Java编写的应用程序制作GUI。 我用Scene Builder制作了fxml文档,正确设置了fx: id,现在我正在尝试对表单进行简单的更改。 我的DocumentController: 我的外汇主文件: 我现在想要的一切,都是将LabelData设置为实际时间戳,但当我运行FX主文件时,什么都不会发生。有人能帮我吗? 谢谢你保罗 更新时间: 我的整个FXML文档: 我想要的一切

  • null 我是否可以从子控制器-b更改父FXML-A中标签的文本?