我有一个JavaFX应用程序,似乎无法更改Cursor,并希望有人可以看一下我的代码,也许让我知道我做错了什么。
发生的基本流程:
在我创建要执行的任务并点击REST API之前,我在打电话:
myPrimaryStage.getScene().setCursor(Cursor.WAIT);
然后,在完成任务后,我将调用:
this.myController.getMyPrimaryStage().getScene().setCursor(Cursor.DEFAULT);
但是由于某种原因,我从未真正看到游标发生变化。该应用程序运行正常,但光标始终保持默认状态。
有人有任何建议吗?
注意:我添加了for循环只是为了花些时间,所以我可以查看任务是否真的完成得很快,但是即使运行了,我也从未看到游标发生变化。所以我一定做错了。
Main.java
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);
}
}
MyController.java
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;
}
}
CreateOWMWorker.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);
}
}
}
最佳答案
您是否尝试过更改根元素的光标?
代替这个
myPrimaryStage.getScene().setCursor(Cursor.WAIT);
试试这个:
myPrimaryStage.getScene().getRoot().setCursor(Cursor.WAIT);