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

更改/更新其他类中的FXML组件

施慈
2023-03-14
package sample;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;  
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{

Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
Controller controller = new Controller();
Platform.runLater(()->controller.setLabel());

}
<BorderPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <center>
      <Label fx:id="label" text="This" BorderPane.alignment="CENTER" />
   </center>
</BorderPane>

控制器类别:包装样品;

import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class Controller {
@FXML
private Label label=new Label();

public void setLabel(){
    label.setText("Test");
}
}

共有1个答案

沈思博
2023-03-14

很简单...您可以通过在控制器类中为所需的标签添加getter方法来更改主类中的标签文本,然后使用控制器对象(loader.getController())在主类中获取它并更新其文本。或者使用Main中的Controller对象调用Controller类内部的setter方法。正如DVagra所说,使用loader.getController()获取控制器对象。(其中loader是FXMLoader的对象)。

此外,您不需要Platform.runlater()来更新gui控件。因为您已经在FX线程上运行了。

不管怎样,这是你需要的。

package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(Main.class.getResource("sample.fxml"));
    Parent root = loader.load();
    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 300, 275));
    primaryStage.show();

    Controller controller = loader.getController();

    controller.setLabel("Test");
//  Or
//  controller.getLabel().setText("Test");
 }
public static void main(String[] args) {
    launch(args);
 }
}
package sample;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable{
@FXML
Label label;

//setter
public void setLabel(String labelText){
    label.setText(labelText);
}

//getter for label
public Label getLabel() {
    return label;
}

@Override
public void initialize(URL location, ResourceBundle resources) {
 }
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane xmlns="http://javafx.com/javafx/8.0.60" 
xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<center>
    <Label fx:id="label" text="This" BorderPane.alignment="CENTER" />
</center>
</BorderPane>
 类似资料:
  • 我的表单上有一个组件(id="theDocument"),我想在某些情况下以不同的方式呈现。 如果是我的豆子。文档'存在,我希望它呈现为p:commandLink,但如果它不存在,我希望它呈现为纯文本,例如h:outputText。 此条件将在文件上传后更改(上传后,myBean.theDocument将存在,因此我希望它呈现为p:命令链接)。 所以在我的p: fileUpload上,我有这样的东

  • 我是个新来的土生土长的人。我有一个屏幕,它将根据其当前状态进行渲染,如下所示。默认情况下(初始状态),它将呈现登录屏幕。App.js 当下面的登录成功后,我需要将组件应用程序的状态从“初始”更改为“已登录”。我怎么做呢?这里的登录函数仅用于测试目的,所以不必太在意它。LoginBox.js

  • 我想从我用FXMLoader加载的场景中获取控制器。用例是: > 我的 JSON 管理器收到一个 JSON 对象 我启动的任务显示一个新的场景 在那之后,我有空旷的场景。 现在我这样做来填充组件 我的问题是,有没有更简单的方法来做到这一点?我有一个在 FXML 中指定的控制器 我想获得具有绑定值的实例(在本例中称为name的TextField) 提前谢谢

  • 对来说非常陌生,对控制器的工作方式缺乏一点了解,但现在就开始了。 我的问题很简单。我需要在运行时更新屏幕上的。 这个问题以前在这个网站上已经解决过: Java FX更改标签文本 Java FX更改标签文本2 传递参数 还有,这些链接描述的是同样的事情,但做的不同吗? 最后,具有应设置为的值的类: 我研究了依赖注入,尝试绑定和传递参数,但得到了相同的结果。我知道这是直截了当的,任何帮助都很感激!谢了

  • 问题内容: 当我选择第一个SelectOnMenu的任何项目时,我想更新第二个SelectOneMenu。现在,我从ManagedBean获取SelectOneMenus的值。我想我必须使用AJAX(jquery)将参数发送到ManagedBean。 问题答案: 实际上,您可以使用ValueChangeListener,当selectOneMenu的值更改时将调用它: 然后,在您的bean中,您可

  • 问题内容: import java.awt.event.ActionListener; import java.util.; import java.awt. ; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.ActionEvent; import java