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)。我错过了什么?

4

2 回答 2

3

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

于 2013-06-24T17:01:56.827 回答
1

您是否曾经为此尝试过 Platform.runLater:

它应该像这样工作:

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

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

于 2014-06-02T21:02:13.843 回答