有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Textarea如何在每次循环迭代后追加文本?

我想使用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) 个答案

  1. # 1 楼答案

    我假设您希望创建类似“异步调用”的东西,因为您希望在每次检索列表对象的值时追加数据

    你能做什么。正在围绕循环启动一个线程,并将UI更改放在一个平台中。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++
        }
    });
    
  2. # 2 楼答案

    我建议你接受@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);
        }
    
    }
    

    这是一个核心重复的问题See