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

JavaFX文本区域立即更新

涂玉韵
2023-03-14

我正在使用Java FX textarea,并用它来为正在进行的步骤提供信息。

步骤如下。复制文件。删除旧文件。复制新文件。然后将一些属性从旧文件复制到新文件。

当点击一个按钮时,整个步骤开始。

我面临的问题是,当我使用append命令时,文本区域没有被更新。

append 命令添加数据,当函数终止时,我将所有文本放在一起。我希望在调用函数时更新文本区域。

在我的程序中,复制文件操作需要一些时间,因为它是一个大文件。所以在开始时,我显示操作已开始的消息。在操作结束时,我想显示操作已结束。

但是文本区域显示所有这些文本。

我在oracle论坛上读到,FX中的文本区域使用单个线程,因此在整个过程完成之前不会显示任何内容。

文章 : https://community.oracle.com/message/9938117#9938117

谁能建议我该怎么办??

新建编辑

好的,在按钮上单击我正在调用一个执行以下方法的函数。

  public void executeCmds(){

        createTempDirectory();
        copyConfigPropetiesFileValues();
        copyConfigProperties();
        copyYMLFile();
        copyYMLFileProperties();

        stopTomcatServer();

        deleteOldWar();
        copyNewWar();
        startTomcatServer();

        copyOldConfigFile();
        copyOldYMLFile();
 }

现在每个功能都是一个过程,应该按顺序执行。在每一步完成后,我想用一条成功消息更新GUI文本区域,说明这一步已经完成。

对于我正在使用的方法如下:

  public void createTempDirectory(){
         //Creating temporary directory for copying property files
         status_text_area.appendText("Trying to create a temp directory \n");
        File tempDir= new       File(tomcat_path.getText()+filePath.path_to_temp_directory);
         if(!tempDir.exists())
             tempDir.mkdirs();

    status_text_area.appendText("Created Temp directory to copy Config Files \n");

}

其他功能也是如此。复制战争文件功能和删除战争文件功能需要时间,因为它将130 MB的文件从一个位置复制到另一个位置。

所以我希望文本区显示为,1。开始复制文件,一段时间后

但是问题是,在所有的函数都被执行之前,文本区域根本不会被填充。

如果我试图通过线程执行这些,那么执行顺序就没有保证。请帮忙

共有3个答案

仲承福
2023-03-14

请问你能给一些代码摘录吗?

我经常犯类似的错误:concat返回连接字符串,并且不修改应用concat方法的字符串。

        String firstString = "txt";
        String resultString = firstString.concat(" next");

如果你的关注点真的与线程相关联,并且你的代码与你在文章中提到的代码很接近,我建议你通过并行线程复制数据,比如javafx.application.Platform.runLater(e-

编辑:正如James_D提到的,如果操作时间真的很长,你最好使用任务。阅读我链接的文章,了解更多关于替代方法及其用法的信息。

萧宣
2023-03-14

扩展批准的响应-如果您需要在执行其他操作之前等待更新的UI,请使用PlatformImpl。runAndWait(可运行可运行)

Thread thread = new Thread(() -> {
    yourMethod();
    PlatformImpl.runAndWait(() -> {
        methodForUI();
    });
    methodAfterUIChanged();
});
thread.start();
国盛
2023-03-14

在后台线程中运行< code>executeCmds()方法,并使用< code>Platform.runLater()更新文本区域:

public void executeCmds(){
    Thread thread = new Thread(() -> {
        createTempDirectory();
        copyConfigPropetiesFileValues();
        copyConfigProperties();
        copyYMLFile();
        copyYMLFileProperties();

        stopTomcatServer();

        deleteOldWar();
        copyNewWar();
        startTomcatServer();

        copyOldConfigFile();
        copyOldYMLFile();
    });
    thread.start();
}

然后

public void createTempDirectory(){
         //Creating temporary directory for copying property files
    updateStatus("Trying to create a temp directory \n");
    File tempDir= new File(tomcat_path.getText()+filePath.path_to_temp_directory);
    if(!tempDir.exists())
        tempDir.mkdirs();

    updateStatus("Created Temp directory to copy Config Files \n");
}

// similarly for other methods

private void updateStatus(String message) {
    if (Platform.isFxApplicationThread()) {
        status_text_area.appendText(message);
    } else {
        Platform.runLater(() -> status_text_area.appendText(message));
    }
}
 类似资料:
  • 我有一个带有一些TextArea元素的GUI来显示信息。由于GUI将对keyevents做出反应,我在场景元素中添加了一个EventHandler。因为我不想为每个文本区域添加一个EventHandler,所以我禁用了它们以防止它们聚焦,因为这样场景的EventHandler就不再工作了。现在我有一个问题:文本显示为灰色,不再是黑色,尽管我在css文件中更改了它。你知道为什么文本不是黑色的吗?我该

  • 我需要在我的程序中使用文本区域,我也需要它是只读的。 这是我创建textArea的主程序的一部分: 这是我的css文件的一部分: 如果我删除行:ta.setDisable(true);Css的工作方式就像我希望它工作一样。但是在我将禁用 true 设置为 true 之后,它只会使文本区域透明,这使得文本非常难以阅读,并且背景颜色也不是我想要的。 有没有其他方法可以只读设置文本?或者有没有办法在禁用

  • 我使用的是JavaFX 8,有一个只读的TextArea,根据具体情况显示确认消息或错误消息。我希望确认消息有黑色文本,但我希望错误消息有红色文本。我如何在JavaFX 8中做到这一点?就目前而言,我更喜欢用编程的方式来完成,但是我当然也对如何在FXML中完成这个程序的下一个草案感兴趣。 从本质上讲,我正在显示一个 tableView,并让用户编辑 TableView 单元格中的信息。如果用户在单

  • 我有一个如下的文本区域, 我需要突出显示或选择所有文本“Highlight me”。我没有找到任何方法来突出显示文本区域中的文本。此外,我在JavaFX中找不到任何其他API可以突出显示特定文本或字母的出现,例如Swing中的JTextArea。有人可以建议我如何在文本区域突出显示字符串吗?或者除了JavaFX中的这个文本区域之外,还有其他API可用吗? 我的代码: 预期输出: 线条应以以下任何颜

  • 下面是我的代码的一个片段。调用filteredData()时,状态未更新。在状态更新之前,我必须单击按钮两次。这是一个旧项目,我正在使用钩子更新它。我以前在设置状态后使用了回调函数,但我不能用钩子实现。 }

  • 主要内容:创建文本域,TextField文本,示例-1,实例-2,实例-3用于单行文本输入。请看下面的示例 - 和字段扩展了类,它是JavaFX中所有文本控件的超类。 上面的代码生成以下结果。 创建文本域 我们可以使用类的构造函数来创建文本字段。 只是一个带有光标的文本输入框,通常我们需要一个控件来告诉文本字段的目的。以下代码创建一个控件来标记对应的文本字段是用于名称输入。然后它创建一个对象。之后,它使用HBox布局和。 使用预定义文本创建文本字段。 TextField