gpt4 book ai didi

JavaFX setCursor( ) 不工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:21 25 4
gpt4 key购买 nike

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

发生的事情的基本流程:

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

就在我创建任务并访问 REST API 之前,我正在调用:

myPrimaryStage.getScene().setCursor(Cursor.WAIT);

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

this.myController.getMyPrimaryStage().getScene().setCursor(Cursor.DEFAULT);

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

有人有什么建议吗?

注意:我在 for 循环中添加只是为了消耗一些时间,这样我就可以看到任务是否真的很快完成了,但即使在运行时,我也看不到光标发生变化。所以我一定是做错了什么。

主程序.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);
}
}

我的 Controller .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;
}
}

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

最佳答案

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

而不是这个

myPrimaryStage.getScene().setCursor(Cursor.WAIT);

试试这个:

myPrimaryStage.getScene().getRoot().setCursor(Cursor.WAIT);

关于JavaFX setCursor( ) 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com