• Как заставить кнопку в JavaFX ничего не делать?

    @MicroKlizma Автор вопроса
    Благодаря комментам под вопросом и некоторому гуглению разобрался что к чему. Я решил проблему путем создания нового потока. Таким образом, поток будет работать параллельно с основным потоком. И в то время пока кнопка существует, параллельно и независимо другой поток может ей управлять. При нажатии на кнопку я вызываю метод onAction(), в котором создаю новый поток с точкой входа в виде метода, который все должен обрабатывать
    public void onAction() throws InterruptedException {
            Thread thread = new Thread(this::someMethod);
            thread.start();
        }

    Далее делаем в этом методе все, что хотели делать, но при этом, пока выполняется код, делаем кнопку неактивной: button.setDisable(true). Благодаря этому она меняет цвет и пропадает возможность по ней кликать (также вроде можно модифицировать ее стиль в этом состоянии в css файле: .button:disabled)
    public void someMethod() {
            button.setDisable(true);
            //code
            button.setDisable(false);
        }

    Это решение у меня работало нормально и так, как я хотел. Но оно вызывает исключение, хотя на него можно забить если обернуть в try catch, все равно будет работать:
    Exception in thread "Thread-3" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
    Я считаю, что хороший программист должен с исключениями бороться :)
    Как я понял, исключение выбрасывается тогда, когда меняется вид (UI), элементы (узлы) (node) приложения. Видимо, это можно делать только в FX applicaton thread. В моей программе я изменял текстовое поле и поле с изображением. И решение есть - делать все эти изменения с помощью Platform.runLater(). В него, так же как и при создании Thread, передается объект типа Runnable. Runnable - это функциональный интерфейс, поэтому вместо того, чтобы создавать целый класс, реализующий Runnable, для краткой записи воспользуемся лямбда-выражениями. В моем случае для моего приложения метод будет выглядеть примерно так:
    public void someMethod() {
            button.setDisable(true);
            //some code
            Platform.runLater( () -> textField.setText(text) );
            //some code
            Platform.runLater( () -> imageView.setImage(image) );
            //some code
            button.setDisable(false);
        }

    Интересно, что setDisable() по идее тоже нужно оборачивать в Platform.runLater(). Но я протестировал, программа срабатывала без исключений даже если не обернуть, хотя казалось бы, этот метод заставляет кнопку менять цвет и делает ее неактивной, некликабельной, меняет состояние кнопки (кстати узнать это состояние можно с помощью isDisabled()), но нет, все работает
    Ответ написан
    Комментировать
  • Почему не загружается JavaFX controller?

    @MicroKlizma Автор вопроса
    В общем все-таки понял в чем проблема, нужно было добавить этот пакет в файл module-info.java
    А именно, добавить строку
    opens com.app.view to javafx.fxml;
    Ответ написан
    Комментировать