2013-06-24 5 views
1

J'essaie de changer le curseur pour indiquer que le programme est occupé. Il semble que cela devrait être assez simple, mais je n'ai pas réussi à le faire fonctionner correctement et après avoir cherché pendant plusieurs heures, je n'ai pas trouvé la solution. Voici ce que j'essaie de faire.JavaFX 2 curseur indicateur occupé

public class ButtonTest extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
    final StackPane root = new StackPane(); 
    primaryStage.setScene(new Scene(root, 200, 150)); 

    Button button = new Button(); 
    button.setText("Button"); 
    root.getChildren().add(button); 

    primaryStage.show(); 

    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
     // Set the cursor to the wait cursor. 
     root.setCursor(Cursor.WAIT); 
     // Do some work. 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     // Set the cursor back to the default. 
     root.setCursor(Cursor.DEFAULT); 
     } 

    }); 
} 

    public static void main(String[] args) { 
    launch(args); 
    } 
} 

Si je commente le setCursor (Cursor.DEFAULT), après que j'appuie sur le bouton, il attend 5 secondes, puis change le curseur sur le curseur d'attente. Il semble donc qu'il attende après le sommeil, puis exécute setCursor (Cursor.WAIT), immédiatement suivi du setCursor (Cursor.DEFAULT). Qu'est-ce que je rate?

+0

See related: [JAVAFX: comment désactiver le bouton pour une durée spécifique?] (Http://stackoverflow.com/q/16919727) –

Répondre

2

Vous dormez le thread d'interface utilisateur principal qui est le même thread qui est censé changer la forme du curseur. Vous devez démarrer votre sommeil (ou toute opération coûteuse) sur un thread d'arrière-plan, tandis que le thread d'interface utilisateur principal quitte la méthode handle et retourne à la boucle d'événement UI afin que le changement de curseur puisse devenir actif.

+0

Merci pour la réponse. J'ai essayé ce qui suit, mais ça ne marche pas non plus. J'ai très peu d'expérience avec les threads, est-ce que je fais quelque chose de mal? –

+0

Oups, appuyez sur Entrée trop tôt. Je crée un fil, démarrer le fil, définir le curseur d'attente, joindre le fil et le réinitialiser le curseur. Mais ça ne marche toujours pas. –

+0

Ne pas rejoindre le fil! Laissez simplement le gestionnaire revenir. Vous devez réinitialiser le curseur à l'intérieur de la méthode du thread d'arrière-plan, via l'invocation de threads croisés dans le thread d'interface utilisateur. –

1

Avez-vous déjà essayé Platform.runLater pour cela:

Il devrait fonctionner comme ceci:

primaryStage.getScene().setCursor(Cursor.WAIT); 
Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
    doSomethingInteresting(); 
    primaryStage.getScene().setCursor(Cursor.DEFAULT); 
    } 
}); 

L'idée est simple: dans l'événement d'origine que la forme de la souris est définie et une nouvelle événement est prévu qui effectuera l'action directement après cela.

Questions connexes