gpt4 book ai didi

java - 在主代码停止之前进度指示器不会显示

转载 作者:行者123 更新时间:2023-12-02 04:06:03 28 4
gpt4 key购买 nike

我已经为一个愚蠢的问题苦苦挣扎了好几天,我需要你的帮助。我只是想在一个单独的阶段中显示一个不确定的进程指示器,如下所示,而我的主代码执行一个循环。如果循环时满足特定条件,则进度阶段应关闭并且主代码继续。

enter image description here

现在我可以在主代码开始循环之前打开一个新阶段,但进度指示器还不会显示在该阶段中。但一旦满足条件,指示器就会突然出现在舞台上并旋转。但是,一旦主代码再次开始运行,指示器就会卡住,但仍然可见。

我将简要解释下面每个代码的作用。如何使加载阶段最初出现且指示器可见,然后在调用 showMessage() 方法时该阶段关闭?基本上我想向用户展示后台循环正在发生,直到主代码到达 showMessage()

Main.java我不会发布它,因为它只创建第一个 GUI。它使用 menu.fxml 作为 FXMLLoader 中的资源...并且 menu.fxml 使用 Controller.java 作为 Controller 。

Controller.java此代码将主 GUI 中的场景更改为新布局,要求用户单击可见按钮之一。然后,它检查源按钮是否为 Button1...,如果是,则创建/显示一个使用 sample.fxml 作为资源的新阶段。然后它运行最终文件 Loop.java

public class Controller implements Initializable {

public Stage loadingStage;

@FXML
ProgressIndicator progressIndicator;

public void handlerButtonClick() throws IOException {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("field.fxml"));
Parent rootOne = loader.load();
((Controller) loader.getController()).setPrimaryStage(primaryStage);
((Controller) loader.getController()).setPrimaryScene(scene);
sceneField = new Scene(rootOne, 420, 510);
primaryStage.setScene(sceneField);
primaryStage.setTitle("Import Data");
primaryStage.show();
}

public void fieldOption(ActionEvent e) throws Exception {

source = e.getSource();
if (source == Button1) {

Loop loopObj = new Main();
String[] args = {};

//Create new stage to contain the Progress Indicator
FXMLLoader loader2 = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root2 = loader2.load();
Controller2 controller = loader2.getController();
loadingStage = new Stage();
loadingStage.setTitle("Loading Stage");
Scene scene = new Scene(root2, 200, 200);
loadingStage.setScene(scene);
loadingStage.show();

//Runs the looper
loopObj.start(stage);
}

}

示例.fxml

此代码创建进度指示器,并使用 Controller Controller2

<AnchorPane prefHeight="200.0" prefWidth="200.0" xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/2.2" fx:controller="Controller2">
<children>
<ProgressIndicator fx:id="progressIndicator" layoutX="78.0" layoutY="55.0" progress="-1.0"/>
</children>
</AnchorPane>

Controller2.java此代码实现 Initialized 以使进度指示器可见:

public class Controller2 implements Initializable {
@Override
public void initialize(URL url, ResourceBundle rb) {
ProgressIndicator progressIndicator = new ProgressIndicator();
progressIndicator.setVisible(true);
}
}

Loop.java这是执行循环的主要代码。加载阶段应显示进度指示器直到 Loop.java 调用其 showMessage() 函数,此时加载阶段关闭。我知道这些方法之一似乎不是必需的,但这只是因为它们出于演示目的而被剥离。

public class Loop extends Application {
@Override
public void start(Stage ignored) throws Exception {
Platform.setImplicitExit(false);
for (int i = 0; i <= 100; i++) {
if (i == 75){
saveAttachment("Hello");
}
}
}

public static void saveAttachment(String subject) throws IOException, MessagingException {
showMessage(subject);
}

private static void showMessage(String subject) throws IOException, MessagingException {
// Close the loading stage here.
}
}

注意它如何使用public void start(Stage Beenigned)。 Main.java 使用public void start(Stage PrimaryStage)。也许这很糟糕。我很沮丧,请帮忙!

更新

我已经应用了 Brian 的建议,并在 Controller.java 中添加了一个新任务,如下所示:

 Stage loadingStage = new Stage();

//create task object
Task<Void> task = new Task<Void>(){
@Override
protected Void call() throws Exception{
System.out.println("Background task started...");
FXMLLoader loader2 = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root2 = loader2.load();
Controller2 controller = loader2.getController();
loadingStage.setTitle("Hello World");
Scene scene = new Scene(root2, 450, 250);
System.out.println("HERE6");
loadingStage.setScene(scene);
System.out.println("HERE7");
loadingStage.show();
System.out.println("HERE8");
return null;
}
};

Thread th = new Thread(task);
th.setDaemon(true);
System.out.println("Starting background task...");
th.start();

现在的问题是它没有到​​达打印输出行“HERE7”。它成功进入任务并继续主代码,但任务没有超出打印“HERE6”的位置,因此没有打开新阶段。给出了什么?

最佳答案

在 Ctlr2 中,您有 ProgressIndicator ProgressIndicator = new ProgressIndicator(); 但如果它位于 FXML 文件中,则无需创建新的。只需执行 @FXML ProgressIndicator ProgressIndicator; 就像您出于某种原因在第一个 Ctlr 中所做的那样??

但这并不能解决您的问题,您正在 JavaFX 应用程序线程(GUI 线程)上运行所有内容。可能发生的情况(我没有真正阅读代码)是,您在同一个线程上执行这两件事,并且进度指示器必须等待 main 完成,然后它才能更新 GUI。您为任务和并发添加标签,这就是您所需要的。

查看此处并搜索更多示例。 https://stackoverflow.com/a/22847734/2855515

关于java - 在主代码停止之前进度指示器不会显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34255435/

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