JavaFX - Как периодически читать XML-файл и обновлять TableView - PullRequest
0 голосов
/ 30 октября 2018

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы мой TableView обновлялся после обновления XML-файла. TableView обновляется немедленно, когда данные были изменены, и когда пользователь выходит и снова открывает приложение, новые данные появляются там, как и должно быть. Но я хочу, чтобы это обновление было «автоматическим», чтобы, если один из 2 пользователей внес изменения, работающее приложение других пользователей также отразит это изменение автоматически.

Я бы хотел периодически читать XML-файл, но мне не повезло. Я использую DOM для чтения файла. Я еще не посмотрел на ScheduledService, но это кажется потенциальным решением. Я также добавил кнопку «обновить данные», где она вызывает класс, в котором я читаю в своем XML-файле, но это тоже не сработало. Есть намеки?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вы можете использовать API WatchService , чтобы следить за папкой. Это может вызвать событие в любое время, когда файл добавляется, удаляется или изменяется.

Вот быстрый MCVE для демонстрации. В этом примере мы будем следить только за изменениями существующих файлов:

import java.io.IOException;
import java.nio.file.*;

import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

public class Main {

    public static void main(String[] args) {

        // Launch the watcher in a background thread
        new Thread(() -> {
            try {
                setupWatcher();
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

    }

    public static void setupWatcher() throws IOException, InterruptedException {

        System.out.println("Listening for changes to DATA.XML");

        // Set the directory we want to watch for changes
        Path dir = Paths.get("your/path");

        // Create the WatchService
        WatchService watchService = FileSystems.getDefault().newWatchService();

        // Only watch for modifications (ignore new or deleted files)
        dir.register(watchService, ENTRY_MODIFY);

        // The WatchKey will collect any events from the WatchService. We want this to run indefinitely so we wrap in
        // an infinite loop
        while (true) {
            // Gets the latest event
            WatchKey watchKey = watchService.take();

            // When a change is found, let's find out what kind and act appropriately
            if (watchKey != null) {

                // For each event triggered
                watchKey.pollEvents().forEach(watchEvent -> {

                    // Get the filename of the file that was modified
                    String filename = watchEvent.context().toString();

                    // If it is the file we care about, do something
                    if (filename.equalsIgnoreCase("DATA.XML")) {

                        // Do your update of the TableView here
                        System.out.println("DATA.XML has been changed!");
                    }

                });

                // After the event was processed, reset the watchKey
                watchKey.reset();
            }
        }

    }
}

Дополнительную информацию можно найти в JavaDocs или в этом руководстве .

0 голосов
/ 30 октября 2018

Возможно, вы захотите использовать Java WatchService, чтобы получать уведомления об изменении содержимого вашего файла. См. Oracle документы

Вот также учебник , показывающий, как его использовать.

...