JavaFX setCursor() 不工作

Chi*_*int 5 java javafx

我有一个 JavaFX 应用程序,我似乎无法更改 Cursor 并希望有人可以看看我的代码,也许让我知道我做错了什么。

发生的事情的基本流程:

  1. 单击按钮
  2. 执行单独的任务以从 REST API 检索数据。
  3. 在 TextArea 组件中显示检索到的数据。

在我创建任务并点击 REST API 之前,我正在调用:

myPrimaryStage.getScene().setCursor(Cursor.WAIT);
Run Code Online (Sandbox Code Playgroud)

然后,在完成我正在调用的任务后:

this.myController.getMyPrimaryStage().getScene().setCursor(Cursor.DEFAULT);
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,我从未真正看到光标发生变化。该应用程序工作正常,但光标始终保持默认状态。

有人有什么建议吗?

注意:我在 for 循环中添加只是为了消耗一些时间,以便我可以查看任务是否刚刚完成得非常快,但即使在运行时,我也从未看到光标发生变化。所以我一定是做错了什么。

主程序

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import logic.MyController;


public class Main extends Application {
    private AnchorPane rootLayout;

    @Override
    public void start(Stage primaryStage) {
        try {
            FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainScreen.fxml"));
            rootLayout = (AnchorPane) loader.load();
            Scene scene = new Scene(rootLayout,400,400);

            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);

            //Store the primaryStage in my controller
            MyController controller = loader.getController();
            controller.setMyPrimaryStage(primaryStage);

            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器

package logic;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.Cursor;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

public class MyController {
    @FXML private Button myButton;
    @FXML private TextArea myTextArea;

    private Stage myPrimaryStage;


    @FXML
    public void initialize() {
        myButton.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                myPrimaryStage.getScene().setCursor(Cursor.WAIT);
                myButton.setDisable(true);
                CreateOWMWorker myWorker = new CreateOWMWorker(MyController.this);
                new Thread(myWorker).start();
            }
        });
    }

    public Button getMyButton(){
        return this.myButton;
    }

    public TextArea getMyTextArea(){
        return this.myTextArea;
    }

    public Stage getMyPrimaryStage() {
        return myPrimaryStage;
    }

    public void setMyPrimaryStage(Stage primaryStage) {
        this.myPrimaryStage = primaryStage;
    }
}
Run Code Online (Sandbox Code Playgroud)

创建OWMWorker.java

package logic;

import javafx.concurrent.Task;
import javafx.scene.Cursor;

import org.json.JSONObject;

public class CreateOWMWorker extends Task{
    private MyController myController = null;

    public CreateOWMWorker(MyController myController){
        this.myController = myController;
    }


    @Override
    protected Object call() throws Exception {
        OpenWeatherClient myTest = new OpenWeatherClient();
        Object someResponse = null;

        try {
            someResponse = myTest.retrieveWeatherData("weather?q=London,uk");
        } catch (Exception e) {
            e.printStackTrace();
        }

        for (int i = 0; i < 1000000; i++) {
            System.out.println("Cycle #: " + i);
        }

        return someResponse;
    }


    protected void done(){
        super.done();

        try {
            JSONObject someResponse = (JSONObject) get();
            if (null != someResponse) {
                JSONObject someObject = someResponse.getJSONObject("wind");
                this.myController.getMyTextArea().setText(someObject.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            this.myController.getMyPrimaryStage().getScene().setCursor(Cursor.DEFAULT);
            this.myController.getMyButton().setDisable(false);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*cel 4

您是否尝试更改根元素的光标?

而不是这个

myPrimaryStage.getScene().setCursor(Cursor.WAIT);
Run Code Online (Sandbox Code Playgroud)

尝试这个:

myPrimaryStage.getScene().getRoot().setCursor(Cursor.WAIT);
Run Code Online (Sandbox Code Playgroud)