私は愚かな問題で何日も苦労してきました.あなたの助けが必要です. メインコードがループを実行している間に、別のステージ内に以下のような不確定なプロセスインジケーターを表示しようとしているだけです。ループ中に特定の条件が満たされた場合、進行ステージが閉じられ、メイン コードが続行されます。
現在、メイン コードがループを開始する前に新しいステージを開くことができますが、進行状況インジケーターはまだステージに表示されません。しかし、条件が満たされると、インジケーターがステージに突然表示され、回転します。しかし、メイン コードが再び実行を開始するとすぐに、インジケーターはフリーズしますが、表示されたままになります。
以下の各コードが何をするかを簡単に説明します。ロード段階が最初にインジケーターが表示された状態で表示され、showMessage()
メソッドが呼び出されたときにその段階が閉じるようにするにはどうすればよいですか? 基本的には、メイン コードが到達するまで、バックグラウンド ループが発生していることをユーザーに示したいと考えていますshowMessage()
。
Main.java
最初の GUI を作成するだけなので、投稿しません。... でmenu.fxml
リソースとして使用し、コントローラーとして使用します。FXMLLoader
menu.fxml
Controller.java
Controller.java
このコードは、メイン GUI のシーンを新しいレイアウトに変更し、表示されているボタンの 1 つをクリックするようにユーザーに求めます。次に、ソース ボタンが ... であるかどうかを確認し、そうである場合は、リソースとして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
このコードは進行状況インジケーターを作成し、コントローラーを使用します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
これは、ループを実行するメイン コードです。ロード ステージは、その関数が呼び出されるまで 進行状況インジケーターを表示する必要があります。その時点で、ロード ステージは終了します。これらのメソッドの 1 つが必要ではないように思われることはわかっていますが、それは単にデモ目的で削除されているためです。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)
ます。おそらくこれは悪いことです。私はとてもイライラしています助けてください!
アップデート
ブライアンの提案を適用し、その中に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" を出力する場所を超えないため、新しいステージは開かれません。何を与える?