我正在尝试更改光标以指示程序正忙。看起来这应该很简单,但我无法让它正常工作,搜索几个小时后,我还没有想出解决方案。这就是我想要做的。
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)。我错过了什么?
答案 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);
}
});
这里的想法很简单:在原始事件中,只定义了鼠标形状并安排了一个新事件,它将在此之后直接执行操作。