JavaFX изменить Text вне контроллера

229
20 июня 2018, 05:10

Я новичок, совсем, поэтому мне пожалуйста как нубу.

Есть GUI созданный через Scene Builder. Одна из кнопок GUI запускает новый Thread со своей реализацией в другом классе, который в последующем должен менять значение в самом GUI(Text в основном) на новые значения.

Если сделать в контроллере кнопку UPDATE к примеру, и приписать ей setText какого нибудь text, все конечно будет работать. Но это не наш случай.

Вопрос 1. Если сделать костыль ради эксперимента в виде public static(в контроллере к переменной Text) и попытаться setText из нового потока в другом классе - не работает, во всяком случае в GUI Нового значения не отображается. А надо чтобы отображались новые значения.

Вопрос 2. Я понимаю что использовать public static Text(в контроллере) в данном случае является ошибкой. В таком случае как правильно обращаться к контроллеру(и нужно ли вообще?) чтобы изменять те или иные значения, или обращаться к функциям?

Вообще знает кто нибудь что почитать на русском по Scene builder + javaFX или может авторов на ютубе каких нибудь?

Answer 1

Кароче все оказалось намного проще. Для того чтобы изменить например Text вне контролера,надо передать сам контролер при создании объекта например(Pon4ik pon4ik = new Pon4ik(this)) где в конструкторе ему будет присвоена соответствующая переменная типа(COntroller guiController = pon4ik) и потом уже можно свободно обращаться к переменным контроллера присвоив им public доступ например guiController.TextField.setText("hello"). Не благодарите :))

Answer 2

Создать метод, который должен вызываться для обновления текста

public void setText(String text){...

В другой поток передать метод, который должен быть вызван для обнволение текста. То есть, в другом классе должно быть что-то вроде.

Consumer<String> consumer;
..
public void setOnUpdateText(Consumer<String> consumer){
    this.consumer = cunsumer;
}

В момент когда необходимо обновить текст вызывать

comsumer.accept("Новый текст");

Так же, нельзя изменять содержимое интерфейса из других потоков, кроме потока пользовательского интерфейса. Потому необходимо использовать Platform.runLater();

Platform.runLater(() -> { 
    consumer.accept("Новый текст");
});
READ ALSO
Авторизация средствами AuthorizationService

Авторизация средствами AuthorizationService

коллеги! Опишу кратко ситуацию (приготовтесь к тяжелому материалу): Есть приложение с авторизацией через сайт, средствами вот этой библиотеки...

171
Смешиваются потоки

Смешиваются потоки

Подскажите, где может быть проблема: Имею сервер, к которому соединяются устройства по tcp socket, на каждое красиво создаётся потокСоединившись,...

189
Выдаёт ошибку при компилиции, пока не дошел до switch

Выдаёт ошибку при компилиции, пока не дошел до switch

Выдаёт ошибку при компилиции, пока не дошел до switch всё идёт нормально, а потом ошибкаГде моя ошибка?

164
ConcurrentModificationException и Хешмап

ConcurrentModificationException и Хешмап

Здравствуйте кидает Exception ConcurrentModificationException на этой строчке for (Transaction t : cgetTransactions())(64 строчка) на 2 итерации

223