Java FX GUI зависает - PullRequest
       4

Java FX GUI зависает

0 голосов
/ 19 сентября 2018

В нашем последнем проекте в школе у ​​меня возникли некоторые проблемы.Я хочу наблюдать Путь для новых записей, путь выбирается кнопкой файлового директора, но если я выбираю какой-либо файл, все окно зависает ... Я думаю, что оно зависло, так как был вызван метод наблюдаем, но я неНе знаю, как решить эту проблему.

Вот код:

public void start() {

    public Path absolutePath;
    final Label labelSelectedDirectory = new Label();
    Button btnOpenDirectoryChooser = new Button();
    btnOpenDirectoryChooser.setText("Open DirectoryChooser");

    btnOpenDirectoryChooser.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            DirectoryChooser directoryChooser = new DirectoryChooser();

            File selectedDirectory =
                    directoryChooser.showDialog(primaryStage);

            if(selectedDirectory == null) {
                labelSelectedDirectory.setText("No Directory selected");

            }else{
                labelSelectedDirectory.setText(selectedDirectory.getAbsolutePath());
                absolutePath = selectedDirectory.toPath();
                try {

                    observePath();

                } catch (IOException | InterruptedException e) {

                    e.printStackTrace();
                }
            }
        }
    });

public void observePath() throws IOException, InterruptedException {

        WatchService watcher = FileSystems.getDefault().newWatchService();
        FileSystem fs = FileSystems.getDefault();
        Path p = fs.getPath(absolutePath.toString());

        WatchKey key = p.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);


            key = watcher.take();
            for (WatchEvent event : key.pollEvents()) {
                if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                    System.out.println("found new data");
                }
                else {
                    System.out.println("no new data found");
                }
            }key.reset();
        }

    }

Я надеюсь, что кто-то может мне помочь.Большое спасибо

Том

1 Ответ

0 голосов
/ 19 сентября 2018

Если ваш метод наблюдений делает тяжелую работу, вы должны выполнить его в новом потоке.

new Thread( ()->{
 observePath();
}).start();

Обработчики событий выполняются в JavafxApplicationThread, который отвечает за обновление пользовательского интерфейса.Вы не должны выполнять никаких длительных задач в этом потоке, иначе вы потеряете функциональность.

Более подробную информацию о потоке приложения можно найти здесь Как работает поток приложения JavaFX?

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