В качестве ответа на этот дублированный вопрос был впервые записан. Я думал, что было бы лучше иметь его здесь, поэтому у нас есть все ответы в одном месте.
Следующее должно работать в целом, только детали зависят от формата дат в JTable
(от другой вопрос). Я предположил, что из JTable
вы получите строку типа 03/07/2018
(мне говорят, что этот формат будет обычным явлением в Португалии). В этом случае следующий разборщик будет хорош для его разбора. Если строка находится в другом формате, форматтер также должен быть другим.
DateTimeFormatter dtfFormatador = DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.forLanguageTag("pt-PT"));
LocalDate data = LocalDate.parse(getData, dtfFormatador);
Instant instante = data.atStartOfDay(ZoneId.systemDefault()).toInstant();
Date dateAntiquado = Date.from(instante);
jdcSeletorDeDatas.setDate(dateAntiquado);
К сожалению, JDateChooser.setDate()
требует объекта old fashoined Date
, хотя мы предпочли бы избежать это устаревший класс. Я использую DateTimeFormatter
для разбора строки из JTable
в LocalDate
и преобразования ее в Date
. LocalDate
- это класс из java.time
, современного API дат и времени Java, который мы должны использовать для даты без времени суток.
Изменить: harsha, ваша строка была
String date = "13 Oct 2016";
Чтобы проанализировать строку в этом формате, используйте следующий форматтер:
DateTimeFormatter dateFormatter= DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.US);
В противном случае используйте код выше, где jdcSeletorDeDatas
является JDateChooser
.
Ссылка: Учебник Oracle: Дата Время , объясняющее, как использовать java.time
.
Объяснение
В первом сценарии , когда вы используете
Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
initStubGamepad();
return null;
}
}
Внутри initStubGamepad()
, который запущен на задаче, вы пытаются обновить компоненты пользовательского интерфейса внутри методов pressBtn()
и releaseBtn()
, поэтому вы сталкиваетесь с
java.lang.IllegalStateException: Not on FX application thread
, поскольку все обновления пользовательского интерфейса должны встречаться в потоке JavaFX
В втором сценарии , когда вы используете
Platform.runLater(new Runnable() {
@Override
public void run() {
initStubGamepad();
}
});
, пользовательский интерфейс не появляется, потому что у вас бесконечный цикл внутри initStubGamepad()
, который помещает поток приложений JavaFX в бесконечный цикл
Решение
. К тому времени, как вы сюда доберетесь, вы должны уже найти решение. Если вы этого не сделали, попробуйте поместить обновление компонентов Javafx в поток пользовательского интерфейса. Таким образом, вместо вызова initStubGamepad()
внутри Platform.runLater
попробуйте вызвать внутри него pressBtn()
и releaseBtn()
.
Попробуйте использовать
while (true) {
if (rnd.nextInt(30) == 3) {
Platform.runLater(() -> pressBtn());
} else if (rnd.nextInt(30) == 7) {
Platform.runLater(() -> releaseBtn());
}
}
или вы также можете использовать
public void pressBtn() {
if(!isXPressed) {
Platform.runLater(() -> iv1.setVisible(true));
isXPressed = true;
}
}
Platform.runLater()
иTask
. – Dragon 21 June 2014 в 12:33