JavaFX 2忙指示光标

时间:2013-06-24 16:02:44

标签: javafx-2

我正在尝试更改光标以指示程序正忙。看起来这应该很简单,但我无法让它正常工作,搜索几个小时后,我还没有想出解决方案。这就是我想要做的。

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);
  }
}

如果我注释掉setCursor(Cursor.DEFAULT),按下按钮后等待5秒钟,然后将光标移动到等待光标。所以它好像等到睡眠之后,然后执行setCursor(Cursor.WAIT),紧接着是setCursor(Cursor.DEFAULT)。我错过了什么?

2 个答案:

答案 0 :(得分:3)

你正在睡觉主UI线程,它与应该改变光标形状的线程相同。您需要在后台线程上启动睡眠(或任何昂贵的操作),而主UI线程退出handle方法并返回到UI事件循环,以便光标更改可以变为活动状态。

答案 1 :(得分:1)

你有没有尝试过Platform.runLater:

它应该像这样工作:

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

这里的想法很简单:在原始事件中,只定义了鼠标形状并安排了一个新事件,它将在此之后直接执行操作。