0

试图在 JavaFX 项目中描述具有整数数组的 TextField 和 TextArea 节点上的增量循环的工作,我必须输出此增量的每个步骤

作为一个简短的说明,假设我们有一个由字符串 6、2、74、64 和 12 组成的小数组。在我们的 for 循环中使用 AppendText 方法会立即显示最终的完整整数数组,而我需要的是展示我的数组逐渐增长,整数如何一个接一个弹出,首先是 6,然后是 2,依此类推,直到我们得到一个完整的数组。就像我们可以在控制台中做的那样。

我正在寻找有关如何在 JavaFX 中实现这一点或学习如何做到这一点的信息。

任何具体、友好和说明性的建议都将受到欢迎。


更新:我的问题被标记为可能与另一个问题重复。

在这个主题上,请注意我所期望的是重现 JavaFX 数组的逐渐显示,而不是更新数组的单个元素,正如在另一个问题中所问的那样,我自己的线程被怀疑是重复的。更新一个元素并更新整个元素数组,这些东西对任何人来说听起来都是一样的(“重复”)吗?

所以:

A.如上所述,我们的问题是不同的;

B.将我的问题声明为重复问题是双重错误的,因为它的答案使用与另一个问题的答案相同的概念(任务类),否则我们也可以将我的问题标记为与所有其他堆栈溢出线程重复,评论我曾经从中找到自己问题的解决方案(例如,关于初始化和使用分配给 Java 循环内外的数组的字符串,该线程的链接可根据要求提供)。

问题和答案被很好地理解为人类辩证法的独立部分,即答案的相似性(尤其是部分答案,我的答案是什么情况)绝不会导致问题的相似性。

PS:请在将问题标记为重复之前理解问题。

PS2:问题已经解决了,但为了遵守本站的规定,我会在接受答案之前遵守 48 小时的限制。

4

2 回答 2

0

此答案假定您要添加延迟,因为它appendText适用于无延迟的文本输出。

如果您想在 ui 中显示长时间运行的任务的更新,只需在非应用程序线程上运行该任务并使用它Platform.runLater来更新文本。

要在特定延迟后显示文本,可以使用 aTimeline来更新text属性(List为了简单起见,我使用 a ):

static void showListGradually(List<?> list, StringProperty outputProperty, Duration delay) {
    // timeline updates text property to non-empty sublists
    Timeline timeline = new Timeline(new KeyFrame(delay, new EventHandler<ActionEvent>() {

        int sublistSize = 1;

        @Override
        public void handle(ActionEvent event) {
            outputProperty.set(list.subList(0, sublistSize++).toString());
        }

    }));
    timeline.setCycleCount(list.size());

     // No need to use Platform.runLater here, if this is the application thread
    Platform.runLater(() -> {
        // set initial value from fx application thread
        outputProperty.set(Collections.EMPTY_LIST.toString());

        timeline.play();
    });
}

showListGradually方法是这样使用的,例如:

showListGradually(Arrays.asList(6, 2, 74, 64, 12), textField.textProperty(), Duration.seconds(1));
于 2016-01-03T14:30:07.187 回答
0

对于有类似问题的人:

我通过实现一个Task 类来解决我自己的问题。

特别是,我:

  1. 在增量循环之前初始化一个空字符串,然后
  2. 将来自Task类的标准updateMessage方法放置在循环中
  3. 用初始化的空字符串参数化它,分配给它自己添加到我的数组的相应整数。
  4. 设置一个线程暂停动作,使整数的逐渐显示更慢,所以看起来更愉快,更引人注目,
  5. 声明了一个 Task messageProperty 监听器
  6. 将此侦听器设置为我的 TextField setText 方法的参数

这样每次循环运行时,它都会完全按照我的预期进行 - 它实时地将新整数添加到一组已经存在和显示的整数中。

下面是一个指向应用程序工作外观的小屏幕捕捉视频的链接- https://youtu.be/VVwcP2Xlo18以及我与上述描述相关的部分代码:

    backgroundUpdate.setOnAction(event -> {
                    tf1.setText("");            
        // Declare a Task class
        Task<Void> task = new Task<Void>() {

            // Override (declare) call method
            @Override
            public Void call() throws Exception {

                // Instantiate an empty string
                String lineOfData = "";
                int[] array1 = { 6, 2, 74, 64, 12 };

                // Loop through your array of integers
                for (int i = 0; i <= array1.length; i++) {
                    // Pause the loop
                    Thread.sleep(500);

        // Parameterize the standard 'updateMessage' method of Task class
        // Do this by assigning the initialized-above empty string incremented
        // by an Integer from declared-above array of integers, previously
        // converted into String value
                    updateMessage(lineOfData = lineOfData + (String.valueOf(array1[i])) + " ");
                }
                return null;
            }
        };
        // Add a listener on messageProperty
        task.messageProperty().addListener((obs, oldMessage, newMessage) ->

        // Set the textfield's text to new message of your listener
        tf1.setText(newMessage));
        new Thread(task).start();
    });
于 2016-01-05T00:22:03.007 回答