2016-04-19 24 views
0

私はメインスレッドにいます。メニューからアイテムを選択するときは、guiが新しいパネルを表示する前にデータベースを呼び出す必要があります。これには時間がかかります。この間、私は待機カーソルを表示したい。 私は方法を見つけましたが、コードは醜いです。どのようにこれはよりエレガントに行うことができますか? この質問は、長時間実行されているタスクがguiで動作しているため、他の質問とは異なります。GUIが変更されるのを待っている間にJavaFXがカーソルを変更します

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'を使用しての全体の目的に反し内、ロジックは、UIスレッド上で実行すると同じように(カーソルの変更を含む)更新をブロックします。 – Itai

+0

このようにして、カーソルはステータスを待って戻ってきます。コードは動作しますが、それは醜いです。 –

+0

長時間実行されるタスクはUIを更新するため、UIスレッドで実行するのは正しいです。私は別の質問が見つかりました: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

関連する問題