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

从Controller和AND应用程序类外部操作FXML节点

颜霖
2023-03-14

我需要操作控制器类中的元素。但是,我设法找到的每个html" target="_blank">示例都通过扩展应用程序的类执行此操作。

我需要操作文本字段输入来自 VBox样本控制器在类主。

操作如下:

inputText.setText(“TEST”);


期望的结果是一旦启动FXML应用程序,inputText TextField就会预先填充文本“TEST”。
我的困惑源于如何在任何地方操作此字段,但:

  • VBoxSampleController
  • 用户界面管理器

将VBoxsampleController设置为static,以便我可以使用类名访问它:

UIManager.vbsc.inputText.setText("TEST");

什么都不做。启动的FXML窗口中的元素不变。它仍然是空的。< br >此项目取自https://examples . javacodegeeks . com/desktop-Java/Java FX/Java FX-applications-efx clipse/< br >谢谢。

完整代码:

/* Main */
public class Main {
    public static void main(String[] args) {
        UIManager.main(args);
        // Does nothing
        // UIManager.vbsc.inputText.setText("TEST");
        // I want to change inputText here
    }
}


/* UIManager */
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.fxml.FXMLLoader;

public class UIManager extends Application {

    public static VBoxSampleController vbsc;

    public FXMLLoader loader;

    @Override
    public void start(Stage primaryStage) {
        try {
            loader = new FXMLLoader();
            loader.setLocation(Main.class.getResource("VBoxSample.fxml"));
            VBox root = loader.load();
            Scene scene = new Scene(root, 400, 400);
            primaryStage.setScene(scene);
            primaryStage.show();

            vbsc = loader.getController();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);

    }

}


/* VBoxController */
import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;

public class VBoxSampleController {
    @FXML
    // The reference of inputText will be injected by the FXML loader
    public TextField inputText;
    // The reference of outputText will be injected by the FXML loader
    @FXML
    private TextArea outputText;

    // location and resources will be automatically injected by the FXML loader
    @FXML
    private URL location;

    @FXML
    private TabPane mainPane;

    @FXML
    private ResourceBundle resources;

    // Add a public no-args constructor
    public VBoxSampleController() {
    }

    @FXML
    private void initialize() {

    }

    @FXML
    private void printOutput() {
        outputText.setText(inputText.getText());
    }
}


<!-- FXML -->
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="VBoxSampleController">
  <children>
    <Label alignment="CENTER_LEFT" cache="true" cacheHint="SCALE" prefHeight="30.0" prefWidth="200.0" text="Please insert Your Input here:" textAlignment="LEFT" />
    <TextField fx:id="inputText" prefWidth="100.0" />
    <Button alignment="CENTER_RIGHT" contentDisplay="CENTER" mnemonicParsing="false" onAction="#printOutput" text="OK" textAlignment="CENTER" />
    <Label alignment="CENTER_LEFT" cache="true" cacheHint="SCALE" prefHeight="30.0" prefWidth="200.0" text="Your Input:" textAlignment="LEFT" />
    <TextArea fx:id="outputText" prefHeight="100.0" prefWidth="200.0" wrapText="true" />
  </children>
</VBox>

共有3个答案

叶翰林
2023-03-14

您的问题似乎源于您是在主线程上而不是在平台线程上进行更新。这里有两个问题。

    < li >您应该始终在平台线程上进行用户界面更改。 < li >您正在执行< code > ui manager . vbsc . input text . settext(" TEST ");在启动方法之前。

试试看。

Platform.runLater( () -> UIManager.vbsc.inputText.setText("TEST") );
印季
2023-03-14
public class Main extends Application {
//controllers
static HomeController homeController;
static StageController stageController;
//...
}

在家庭控制器类的初始化方法中,写:

homeController = this;

并在StageController类的initialize方法中编写:

StageController = this;
锺威
2023-03-14

我认为发生这种情况是因为您试图从非静态方法修改静态变量:

@Override
public void start (Stage primaryStage) { // non-static method

    vbsc = loader.getController(); // vbsc is a static variable

}

如果我猜对了,您正在尝试在应用程序启动时动态更新 FXML 字段。因此,您可以通过使用控制器的 initialize() 方法轻松实现此目的:

public class VBoxSampleController {

    @FXML                        // I suggest you to always keep class variable 
    private TextField inputText; // field private or non-public to prevent
                                 // unauthorized modifications

    ...

    @FXML
    public void initialize() {

        String text = "TEST"; // or any other at-runtime generated string
        inputText.setText(text);
    }

    ...

}
 类似资料:
  • 谁能帮我一下。我是JavaFX和FXML的新手,我已经尝试了无数个小时来尝试做一些没有任何运气的事情。谁能给我一个代码的工作示例 1)加载一个包含节点(如标签和按钮)的FXML,这些节点嵌套在不同窗格和节点的几层深处; 2)遍历整个场景,列出节点(如标签和按钮); //

  • 问题内容: 我正在编写一个使用node.js访问本地文件系统的桌面Web应用程序。我目前可以使用node.js打开文件并将其复制到硬盘驱动器上的不同位置。我还想做的是允许用户使用与文件类型关联的应用程序打开特定文件。换句话说,如果用户在Windows环境中选择“ myfile.doc”,它将使用该文件启动MSWord。 我一定是术语的受害者,因为除了与node.js进行通信的子进程的生成之外,我什

  • 我可以制作 Azure 操作管道,但我的问题是,我已将代码签入存储库,而我们不应该在其中签入应用程序属性文件。 这意味着在部署时,我应该必须从某个安全的地方下载应用程序属性文件,并在部署到应用程序引擎之前构建我的Spring启动应用程序。 因此,到目前为止,我所做的是,在运行时将我的应用程序属性文件下载到azure agent中。我将属性文件传递到maven build命令中,但是没有成功。[注意

  • 问题内容: 我正在使用ROS开发用于多机器人系统的GUI,但是我在界面中的最后一件事就是冻结:将RVIZ,GMAPPING或其他屏幕嵌入到我的应用程序中。我已经在界面中放置了一个终端,但是无法绕开如何向我的应用程序添加外部应用程序窗口的问题。我知道PyQt5具有createWindowContainer,它使用窗口ID来停靠外部应用程序,但是我没有找到任何示例来帮助我。 如果可能的话,我想在应用程

  • 问题内容: 我需要能够运行外部应用程序并与之交互,就像从命令行手动运行它一样。我发现的所有示例仅涉及运行程序和捕获输出。 下面是一个非常简单的示例,希望该示例说明我要完成的工作。 我试图调整各种示例,发现这些示例以零成功实现了这一目标。看起来,即使“ rm”正在等待响应,Go仍会关闭该过程。 您可以提供的任何示例,文章或建议,将不胜感激。提前谢谢了。 问题答案: 您有两种可能性。首先是使用Read

  • 当 Puppet 运行在一个节点上,它需要知道这个节点应该应用了哪些类。 例如,如果这是一个 web 服务器节点,它可能需要包含一个 apache 类。 将类映射到节点的一种简单方法是在配置清单里声明,例如下面是一个 nodes.pp 文件的例子: node web1 { include apache } 另外,你可以使用 外部节点分类器(external node classifier,E