Линейная строка JavaFX не работает [дубликат]

В качестве ответа на этот дублированный вопрос был впервые записан. Я думал, что было бы лучше иметь его здесь, поэтому у нас есть все ответы в одном месте.

Следующее должно работать в целом, только детали зависят от формата дат в 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.

12
задан Dragon 20 June 2014 в 18:11
поделиться

1 ответ

Объяснение

В первом сценарии , когда вы используете

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;
    }
}
24
ответ дан ItachiUchiha 22 August 2018 в 03:55
поделиться
  • 1
    Спасибо, большое спасибо за объяснение. Я понял, что было не так в использовании Platform.runLater() и Task. – Dragon 21 June 2014 в 12:33
Другие вопросы по тегам:

Похожие вопросы: