2016-04-19 11 views
0

Я на главной теме. При выборе элемента из меню необходимо вызвать базу данных, прежде чем gui сможет отобразить новую панель. Это занимает некоторое время. За это время я хочу показать курсор ожидания. Я нашел способ, но код выглядит уродливым. Как это можно сделать более элегантно? Этот вопрос отличается от других, потому что долго работающая задача работает на gui.JavaFX сменяет курсор во время ожидания изменения gui

menuitem.setOnAction(event -> { szene.setCursor(Cursor.WAIT); 
           Task<Void> task = new Task<Void>() 
           { 
            @Override 
            public Void call() throws Exception 
            { 
            Platform.runLater(new Runnable() 
            { 
             @Override 
             public void run() 
             { 
              // do some stuff 
              szene.setCursor(Cursor.DEFAULT); 
             } 
            }); 
            return null; 
            }; 
           }; 
           new Thread(task).start(); 
          }); 
+3

Собирает всю 'Task' логики внутри' Platform.runLater' побеждает всю цель использования 'Task', так как логика будет работать в потоке пользовательского интерфейса , блокируя обновления (включая изменения курсора). – Itai

+0

Таким образом, курсор изменится на состояние ожидания и обратно. Код работает, но он уродлив. –

+0

Долгосрочная задача - обновление пользовательского интерфейса, поэтому корректно запускать его в потоке пользовательского интерфейса. Я нашел другой вопрос: http://stackoverflow.com/questions/27309642/javafx-updating-ui-from-a-thread-without-direct-calling-platform-runlater Возможно, мое решение является правильным. –

ответ

1

Вы можете использовать:

Task<Void> task = new Task<Void>() { 

      @Override 
      protected Void call() throws Exception { 
       //action 
       return null; 
      } 
     }; 

task.setOnSucceeded(e -> scene.setCursor(Cursor.DEFAULT)); 
task.setOnFailed(e -> scene.setCursor(Cursor.DEFAULT)); 

scene.setCursor(Cursor.WAIT); 
new Thread(task).start(); 
+0

К сожалению, это не сработает. Курсор ожидания никогда не отображается. –

+0

Вы должны установить тип курсора, прежде чем запускать задачу – jns

Смежные вопросы