2016-04-19 10 views
0

Ich bin auf dem Hauptthread. Wenn Sie ein Element aus dem Menü auswählen, muss eine Datenbank aufgerufen werden, bevor die GUI das neue Feld anzeigen kann. Das braucht etwas Zeit. Während dieser Zeit möchte ich den Warte-Cursor zeigen. Ich habe einen Weg gefunden, aber der Code sieht hässlich aus. Wie könnte das eleganter gemacht werden? Diese Frage unterscheidet sich von anderen, weil die lange laufende Aufgabe auf der GUI funktioniert.JavaFX Cursor während des Wartens auf die GUI zu ändern ändern

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

die gesamte 'Task' Logik Putting innen' Platform.runLater' den gesamten Zweck besiegt einen 'Task' zu verwenden, da die Logik auf dem UI-Thread laufen würde , Blockieren von Updates (einschließlich Cursoränderungen). – Itai

+0

Auf diese Weise ändert sich der Cursor in den Wartezustand und zurück. Der Code funktioniert, aber es ist hässlich. –

+0

Die lang andauernde Aufgabe besteht darin, die Benutzeroberfläche zu aktualisieren, daher ist es korrekt, sie im UI-Thread auszuführen. Ich habe eine andere Frage gefunden: http://stackoverflow.com/questions/27309642/javafx-updating-ui-from-a-thread-without-direct-calling-platform-runlater Vielleicht ist meine Lösung die richtige. –

Antwort

1

können Sie verwenden:

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

Leider funktioniert das nicht. Der Warte-Cursor wird nie angezeigt. –

+0

Sie müssen den Cursortyp festlegen, bevor Sie die Aufgabe starten – jns

Verwandte Themen