Frozen TextArea Fx пока пишу в нем - PullRequest
0 голосов
/ 24 апреля 2019

Пытаюсь перечислить большое количество строк в TextArea в Java Fx.Проблема в том, что полоса прокрутки заморожена и не позволяет прокрутить вниз.Я хочу видеть последнюю строку каждый раз.Или есть другой компонент, чтобы показать большое количество строк.Или сделайте быстрее этот процесс.

        Service<Void> service = new Service<Void>() {
            @Override
            protected Task<Void> createTask() {
                return new Task<Void>() {           
                    @Override
                    protected Void call() throws Exception {

                        File dir = new File("C:\\");
                        int[] count = {0};
                        try {
                            System.out.println("Inicia Visitador de Directorios");
                            Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(),
                                    Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                                        @Override
                                        public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
//                                          System.out.printf("Visiting file %s\n", file);
                                            ++count[0];
                                            final CountDownLatch latch = new CountDownLatch(1);
                                            Platform.runLater(new Runnable() {                          
                                                @Override
                                                public void run() {
                                                    try{
                                                        StringBuffer buf = new StringBuffer(textAreaLog.getText());
                                                        buf.append(count[0]+" File "+file+"\n");
                                                        textAreaLog.setText(buf.toString());
                                                    }finally{
                                                        latch.countDown();
                                                    }
                                                }
                                            });
                                            try {
                                                latch.await();
                                            } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }        
                                            return FileVisitResult.CONTINUE;
                                        }

                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }


                        //Keep with the background work
                        return null;
                    }
                };
            }
        };
        service.start();

1 Ответ

2 голосов
/ 24 апреля 2019

Получение TextArea для прокрутки вниз - самая простая часть. Просто используйте appendText вместо установки всего текстового значения TextArea:

textAreaLog.appendText(count[0] + " File " + file + "\n");

Большая проблема, как указал Мэтт, заключается в том, что вы заполняете поток приложения JavaFX. Обход дерева файлов довольно быстро перечисляет файлы, и вы отправляете так много Runnables в поток приложения, что поток не успевает выполнить свою обычную обработку, такую ​​как рисование окна и обработка пользовательского ввода.

Есть несколько способов справиться с этим. Простой подход заключается в добавлении режима ожидания:

try {
    latch.await();
    Thread.sleep(200);
} catch (InterruptedException e) {
    e.printStackTrace();
}

Другой подход заключается в создании собственного буфера, поэтому вы будете добавлять текст большими кусками, например, каждые 1000 строк:

System.out.println("Inicia Visitador de Directorios");

int maxBufferSize = 1000;
Collection<String> buffer = new ArrayList<>(maxBufferSize);

Files.walkFileTree(dir.toPath(), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
    throws IOException {
        ++count[0];
        buffer.add(count[0] + " File " + file + "\n");

        if (buffer.size() >= maxBufferSize) {
            String lines = String.join("", buffer);
            buffer.clear();

            Platform.runLater(() -> textAreaLog.appendText(lines));
        }

        return FileVisitResult.CONTINUE;
    }
});

String lines = String.join("", buffer);
Platform.runLater(() -> textAreaLog.appendText(lines));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...