Постепенно выводить массив с циклом приращения в JavaFX. Чтобы показать не только полный массив, но каждый инкремент массива, предшествующий окончательному выводу
Пытаясь описать в проекте JavaFX работу цикла приращения на узлах TextField и TextArea с массивом целых чисел, я получил вывод каждого шага этого приращения.
В качестве краткой иллюстрации, скажем, у нас есть крошечный массив строк 6, 2, 74, 64 и 12. Используемый внутри нашего цикла for метод AppendText немедленно отображает окончательный полный массив целых чисел, в то время как мне нужно показать, как мой Массив постепенно растет и как целые числа всплывают один за другим, сначала 6, затем 2 и так далее, пока мы не получим полный массив. Так же, как мы можем сделать это в консоли.
Я ищу информацию о том, как реализовать это в JavaFX или что можно узнать, чтобы быть в состоянии сделать это.
Любые конкретные, добрые и наглядные советы будут приветствоваться.
Обновление: мой вопрос был помечен как возможный дубликат другого вопроса.
В этой теме обратите внимание, что я ожидал воспроизвести постепенное отображение массива JavaFX и ничего более, не обновлять один элемент массива, как было задано в другом вопросе, дубликатом которого, как предполагается, является мой собственный поток. Обновление одного элемента и обновление всего массива элементов, будут ли эти вещи звучать одинаково ("дублировать") для кого-либо?
Так:
О. Как объяснено выше, наши вопросы разные;
Б. Вдвойне неправильно объявлять мой вопрос дубликатом, поскольку в его ответе используется та же концепция (класс задачи), что и в ответе на другой вопрос, в противном случае мы могли бы также пометить мой вопрос как дубликат для всех других потоков переполнения стека, комментарии из которого я обычно находил решение своего вопроса (например, вопрос об инициализации и использовании строк, присвоенных массивам внутри и вне циклов Java, ссылка на этот поток была доступна по запросу).
Хорошо понимается, что вопросы и ответы являются независимыми частями человеческой диалектики, то есть сходство ответов (особенно частичное, как в случае с моим ответом) никоим образом не приводит к сходству вопросов.
PS: Пожалуйста, поймите вопросы, прежде чем отмечать их как дубликаты.
PS2: Вопрос уже решен, но для соблюдения правил этого сайта я буду соблюдать ограничение в 48 часов, прежде чем принять ответ.
2 ответа
Для людей, имеющих похожие вопросы:
Я пришел к решению своего вопроса, реализовав класс Task.
В частности, я:
- Инициализировал пустую строку перед циклом приращения, а затем
- Помещенный в цикл стандартный метод updateMessage из класса Task
- Параметризация с помощью этой инициализированной пустой строки, присвоенной ей, добавляется к соответствующему целому числу моего массива.
- Настройте действие "Пауза потока", чтобы сделать постепенное отображение целых чисел медленнее, чтобы на них было приятнее смотреть и что они стали более заметными,
- Объявлен вызов TaskProperty слушателя и
- Установите этот слушатель в качестве параметра для моего метода 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));