我已经在一个愚蠢的问题上挣扎了几天,我需要你的帮助。我只是尝试在一个单独的Stage中显示一个不确定的进程指示器,如下图所示,而我的主代码执行循环。如果在循环时满足某个条件,则进度阶段应该关闭,主代码继续。
现在我可以在主代码开始循环之前打开一个新阶段,但进度指示器还不会在阶段显示。但是一旦满足条件,指示器就会突然出现在舞台上并旋转。但是一旦主代码再次开始运行,指示器就会冻结,但仍然可见。
我将简要解释下面的每个代码的作用。如何使加载阶段最初显示指示符可见,然后在调用showMessage()
方法时该阶段CLOSES?基本上我想向用户显示背景循环正在发生,直到主代码到达showMessage()
。
Main.java
我不会发布它,因为它只创建了FIRST GUI。它使用menu.fxml
作为FXMLLoader
中的资源... menu.fxml
使用Controller.java
作为控制器。
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);
}
}
Sample.fxml
此代码创建进度指示器,并使用控制器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
此代码实现Initializable
以使进度指示器可见:
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 ignored)
的。 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();
现在的问题是,它没有到达打印输出线说&#34; HERE7&#34;。它成功地完成了任务并继续执行主要代码,但任务并没有超出它打印的位置,而且#34; HERE6&#34;因此没有新的舞台开放。是什么给了什么?
答案 0 :(得分:2)
在Ctlr2中,您有ProgressIndicator progressIndicator = new ProgressIndicator();
,但如果它在FXML文件中,您就不会创建新的文件。出于某种原因,就像你在第一个Ctlr中那样@FXML ProgressIndicator progressIndicator;
吗?
但这不会解决您的问题,您将在JavaFX应用程序线程(GUI线程)上运行所有内容。可能发生的事情(我没有真正阅读过代码)是你在同一个线程上做两件事,进度指示器必须等待main完成,然后才能更新GUI。你为任务和并发放置了标签,这就是你需要的东西。
点击此处并搜索更多示例。 https://stackoverflow.com/a/22847734/2855515