Как добавить текст после каждой итерации цикла? - PullRequest
0 голосов
/ 25 октября 2019

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

@FXML
private TextArea logBookTextArea;

for (Input x : inputList) {

    logBookTextArea.appendText("Czytam " +i+" produkt");
    id = dataDownloader.downloadID(x.getProducer_code());
    writer.print(x.getProduct_code() + ';');
    writer.print("0;");
    writer.print(producentChoiceBox.getSelectionModel().getSelectedItem().toString().toUpperCase() + ";");
    writer.print(x.getProducer_code() + ";");
    writer.print(x.getName() + ";");
    writer.print("Import - bez kategorii;");
    writer.print("4.6;");
    writer.print("20;");
    writeImages(id);
    logBookTextArea.appendText("OK");
    logBookTextArea.appendText("\n");
    i++;
}

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Я предполагаю, что вы хотите создать что-то вроде «асинхронного вызова», потому что вы хотите добавлять данные каждый раз, когда это делается с получением значений списка объектов.

Что вы могли бы сделать. Начинает поток вокруг цикла и помещает изменения пользовательского интерфейса в Platform.runLater (...)

ExecutorService ex = Executors.newSingleThreadExecutor(r ->{
        Thread t = Executors.defaultThreadFactory().newThread(r);
        t.setDaemon(true);
        return t;
    });

    ex.execute(()-> {
    int i = 0;
    for (Input x : inputList) {
        int index= i;

        //must be declareid here because of lambda rules
        //or put in a container that is effectively final
        Int id = dataDownloader.downloadID(x.getProducer_code());
        writer.print(x.getProduct_code() + ';');
        writer.print("0;");
        writer.print(producentChoiceBox.getSelectionModel().getSelectedItem().toString().toUpperCase() + ";");
        writer.print(x.getProducer_code() + ";");
        writer.print(x.getName() + ";");
        writer.print("Import - bez kategorii;");
        writer.print("4.6;");
        writer.print("20;");
        writeImages(id);
        Platform.runLater(()->{
           logBookTextArea.appendText("Czytam " +index+" );
           logBookTextArea.appendText("OK");
           logBookTextArea.appendText("\n");

        });
        I++
    }
});
1 голос
/ 25 октября 2019

Я бы посоветовал вам воспользоваться советом @ Slaw. Используйте Timeline.

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication374 extends Application
{
    TextArea textArea = new TextArea();
    List<String> inputList = new ArrayList();
    AtomicInteger counter = new AtomicInteger();

    @Override
    public void start(Stage stage)
    {

        //Add fake data to the list
        for (int i = 0; i < 1000; i++) {
            inputList.add("word ");
        }

        Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(.5), (ActionEvent event) -> {
            textArea.appendText(inputList.get(counter.getAndIncrement()));
        }));
        timeline.setCycleCount(inputList.size());
        timeline.play();

        stage.setScene(new Scene(textArea));
        stage.show();

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}

Это дублирующий вопрос по своей сути. См

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...