Постепенно выводить массив с циклом приращения в JavaFX. Чтобы показать не только полный массив, но каждый инкремент массива, предшествующий окончательному выводу

Пытаясь описать в проекте JavaFX работу цикла приращения на узлах TextField и TextArea с массивом целых чисел, я получил вывод каждого шага этого приращения.

В качестве краткой иллюстрации, скажем, у нас есть крошечный массив строк 6, 2, 74, 64 и 12. Используемый внутри нашего цикла for метод AppendText немедленно отображает окончательный полный массив целых чисел, в то время как мне нужно показать, как мой Массив постепенно растет и как целые числа всплывают один за другим, сначала 6, затем 2 и так далее, пока мы не получим полный массив. Так же, как мы можем сделать это в консоли.

Я ищу информацию о том, как реализовать это в JavaFX или что можно узнать, чтобы быть в состоянии сделать это.

Любые конкретные, добрые и наглядные советы будут приветствоваться.


Обновление: мой вопрос был помечен как возможный дубликат другого вопроса.

В этой теме обратите внимание, что я ожидал воспроизвести постепенное отображение массива JavaFX и ничего более, не обновлять один элемент массива, как было задано в другом вопросе, дубликатом которого, как предполагается, является мой собственный поток. Обновление одного элемента и обновление всего массива элементов, будут ли эти вещи звучать одинаково ("дублировать") для кого-либо?

Так:

О. Как объяснено выше, наши вопросы разные;

Б. Вдвойне неправильно объявлять мой вопрос дубликатом, поскольку в его ответе используется та же концепция (класс задачи), что и в ответе на другой вопрос, в противном случае мы могли бы также пометить мой вопрос как дубликат для всех других потоков переполнения стека, комментарии из которого я обычно находил решение своего вопроса (например, вопрос об инициализации и использовании строк, присвоенных массивам внутри и вне циклов Java, ссылка на этот поток была доступна по запросу).

Хорошо понимается, что вопросы и ответы являются независимыми частями человеческой диалектики, то есть сходство ответов (особенно частичное, как в случае с моим ответом) никоим образом не приводит к сходству вопросов.

PS: Пожалуйста, поймите вопросы, прежде чем отмечать их как дубликаты.

PS2: Вопрос уже решен, но для соблюдения правил этого сайта я буду соблюдать ограничение в 48 часов, прежде чем принять ответ.

2 ответа

Решение

Для людей, имеющих похожие вопросы:

Я пришел к решению своего вопроса, реализовав класс Task.

В частности, я:

  1. Инициализировал пустую строку перед циклом приращения, а затем
  2. Помещенный в цикл стандартный метод updateMessage из класса Task
  3. Параметризация с помощью этой инициализированной пустой строки, присвоенной ей, добавляется к соответствующему целому числу моего массива.
  4. Настройте действие "Пауза потока", чтобы сделать постепенное отображение целых чисел медленнее, чтобы на них было приятнее смотреть и что они стали более заметными,
  5. Объявлен вызов TaskProperty слушателя и
  6. Установите этот слушатель в качестве параметра для моего метода setFext TextField

Таким образом, каждый раз, когда цикл запускается, он делает именно то, что я ожидаю - он добавляет новые целые числа в реальном времени к набору уже существующих и отображаемых.

Ниже приведена ссылка на крошечный видеоролик о том, как выглядит работа приложения, - 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();
    });

Этот ответ предполагает, что вы хотите добавить задержку, так как appendText работает для вывода текста без задержки.

Если вы хотите показывать обновления долгосрочной задачи в пользовательском интерфейсе, просто запустите эту задачу в потоке, не являющемся приложением, и используйте Platform.runLater обновить текст.

Чтобы показать текст после определенной задержки, можно использовать Timeline обновлять text собственность (я использую List для простоты):

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));
Другие вопросы по тегам