Java 执行公共静态方法并捕获返回值,可能吗?
我从Java 执行公共静态方法并捕获返回值,可能吗?,java,javafx,Java,Javafx,我从ScanSystem()调用静态方法AddTask。在这里我想声明一个字符串变量,这看起来很有效,但是AddTask()中的所有内容都是在完成方法ScanSystem()之后发生的,为什么? 完成AddTask() 扫描系统() AddTask() 您似乎正在FX应用程序线程上执行所有这些操作。该线程负责更新UI,因此在整个ScanSystem()(sic)方法完成之前,不会对UI进行任何实际更改 要解决此问题,您需要在后台线程中执行长时间运行的操作,并使用平台计划对FX应用程序线程上的UI
ScanSystem()
调用静态方法AddTask
。在这里我想声明一个字符串变量,这看起来很有效,但是AddTask()
中的所有内容都是在完成方法ScanSystem()
之后发生的,为什么?
完成AddTask()
扫描系统()
AddTask()
您似乎正在FX应用程序线程上执行所有这些操作。该线程负责更新UI,因此在整个
ScanSystem()
(sic)方法完成之前,不会对UI进行任何实际更改
要解决此问题,您需要在后台线程中执行长时间运行的操作,并使用平台计划对FX应用程序线程上的UI进行增量更新。runLater(…)
:
及
你在扫描系统中得到了一个taskId,对吗?当你说AddTask()发生在ScanSystem之后时,你是说AddTask中创建的任务请使用。是的,我在ScanSystem()中创建longTaskId,并用系统时间填充它。之后,我将FX组件的ID(Label和ProgressIndicator)设置为这个ID,这样我就可以在UpdateTask(taskId,…)中访问它
private void ScanSystem() {
double startScanTime = System.currentTimeMillis();
//Preparing Event
String startupTaskText = "System Scan has started!";
double startUpProgress = 0;
String taskID = App.AddTask(startupTaskText, startUpProgress);
String [][] snapshotArray = manager.getSystemSnapshotsScanSystem(); //Get snapshots from Manager in Array
tableScanSystemForSnapshots.setItems(getSnapshot(snapshotArray)); //push values to observableList
double endScanTime = System.currentTimeMillis();
String updateStartupTaskText = "System Scan finished in "+ ((endScanTime-startScanTime)/1000) + " Seconds";
startUpProgress = 1;
UpdateTask(taskID, updateStartupTaskText, startUpProgress);}
public static String AddTask(String taskText, Double progress) {
//TODO: do Add Task Logic here
long longTaskId = System.currentTimeMillis(); //Define TaskID
String taskId = ""+longTaskId;
Label lblTaskEntry = new Label();
lblTaskEntry.setText(taskText);
lblTaskEntry.getStyleClass().add("TaskEntryLabel");
lblTaskEntry.setId(taskId + "Label");
Separator separatorTasks = new Separator();
separatorTasks.setPrefWidth(230);
ProgressIndicator piTaskEntry = new ProgressIndicator();
piTaskEntry.getStyleClass().add("TaskEntryProgressIndicator");
piTaskEntry.setId(taskId + "ProgressIndicator");
if (progress != 0){
piTaskEntry.setProgress(progress);
piTaskEntry.setMaxSize(55, 55); // set maxsize of Progress Indicator if he has progress > 0 and Determinate
}else {
piTaskEntry.setMaxSize(35,35);//set maxsize for Progress Indicator if he has state of Indeterminate
}
HBox hBoxProgressPaneInnerTaskEntry = new HBox();
hBoxProgressPaneInnerTaskEntry.setAlignment(Pos.CENTER_LEFT);
hBoxProgressPaneInnerTaskEntry.setId(taskId + "Hbox");
hBoxProgressPaneInnerTaskEntry.getChildren().addAll(piTaskEntry, lblTaskEntry);
vBoxProgressPaneInner.getChildren().add(0, separatorTasks);
vBoxProgressPaneInner.getChildren().add(1, hBoxProgressPaneInnerTaskEntry);
return taskId;
}
private void scanSystem() {
new Thread(() -> {
double startScanTime = System.currentTimeMillis();
//Preparing Event
String startupTaskText = "System Scan has started!";
double startUpProgress = 0;
String taskID = App.addTask(startupTaskText, startUpProgress);
String [][] snapshotArray = manager.getSystemSnapshotsScanSystem(); //Get snapshots from Manager in Array
tableScanSystemForSnapshots.setItems(getSnapshot(snapshotArray)); //push values to observableList
double endScanTime = System.currentTimeMillis();
String updateStartupTaskText = "System Scan finished in "+ ((endScanTime-startScanTime)/1000) + " Seconds";
startUpProgress = 1;
updateTask(taskID, updateStartupTaskText, startUpProgress);
}).start();
}
public static String addTask(String taskText, Double progress) {
//TODO: do Add Task Logic here
long longTaskId = System.currentTimeMillis(); //Define TaskID
String taskId = ""+longTaskId;
Platform.runLater(() -> {
Label lblTaskEntry = new Label();
lblTaskEntry.setText(taskText);
lblTaskEntry.getStyleClass().add("TaskEntryLabel");
lblTaskEntry.setId(taskId + "Label");
Separator separatorTasks = new Separator();
separatorTasks.setPrefWidth(230);
ProgressIndicator piTaskEntry = new ProgressIndicator();
piTaskEntry.getStyleClass().add("TaskEntryProgressIndicator");
piTaskEntry.setId(taskId + "ProgressIndicator");
if (progress != 0){
piTaskEntry.setProgress(progress);
piTaskEntry.setMaxSize(55, 55); // set maxsize of Progress Indicator if he has progress > 0 and Determinate
}else {
piTaskEntry.setMaxSize(35,35);//set maxsize for Progress Indicator if he has state of Indeterminate
}
HBox hBoxProgressPaneInnerTaskEntry = new HBox();
hBoxProgressPaneInnerTaskEntry.setAlignment(Pos.CENTER_LEFT);
hBoxProgressPaneInnerTaskEntry.setId(taskId + "Hbox");
hBoxProgressPaneInnerTaskEntry.getChildren().addAll(piTaskEntry, lblTaskEntry);
vBoxProgressPaneInner.getChildren().add(0, separatorTasks);
vBoxProgressPaneInner.getChildren().add(1, hBoxProgressPaneInnerTaskEntry);
});
return taskId;
}