Я разрабатываю приложение javaFX, в котором у пользователя есть несколько текстовых полей для заполнения и редактирования. Я хочу, чтобы, если вы вводите новое текстовое поле, перескакивая с другого, нажимая TAB, содержимое текстового поля не выделялось, а также курсор находился справа. У текстовых полей есть прослушиватель событий, который определяет, когда они получают фокус, и я тестировал различные методы API для позиционирования курсора и отмены выбора содержимого при входе в текстовое поле, на данный момент все безуспешно.
Где моя ошибка?
id_ip2B_tf.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (newValue) {
// 1 - don't work
id_ip2B_tf.deselect();
id_ip2B_tf.positionCaret(id_ip2B_tf.getLength());
// 2 - don't work
id_ip2B_tf.end();
}
}
Можете ли вы попробовать завернуть логику установки каретки в Platform.runLater. Что-то типа..
id_ip2B_tf.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (newValue) {
Platform.runLater(()->{
id_ip2B_tf.deselect();
id_ip2B_tf.positionCaret(id_ip2B_tf.getLength());
});
}
}
});
Обратите внимание, что вы можете просто сделать Platform.runLater(id_ip2B_ft::end)
. Метод end
помещает курсор после последнего символа и очищает выделение.
@Slaw, спасибо, что упомянули об этом. Не знаю об этом методе до сих пор.
ответ Саи должен работать для вас, но не имеет отношения к вашему вопросу: пожалуйста, изучите соглашения об именах Java и придерживайтесь их — поля (если не статические final), параметры и локальные переменные используют
camelCase
.