2017-12-14 14 views
0

私はjavafxアプリケーションを持っています。私はそれが完了するまで実行するプログレスバーでアプリケーションを開始するようにプログラムしました。完了すると、ウィンドウが閉じ、ログインウィンドウが開きます。サインインすると、ログインウィンドウが閉じ、メインウィンドウが開きます。スレッドを実行しているタスクが永久に停止するようにスレッドを停止するにはどうすればよいですか?

しかし、それは私のアプリケーションで起こっていることではありません。

私は0-100のプログレスバーを実行するタスクを作って、そのタスクをスレッドで実行するようにしました。タスクが完了すると、ウィンドウが閉じてログインウィンドウが開きます。

私が遭遇している問題は、ログインウィンドウを使用してサインインすると、メインウィンドウが開きますが、ログインウィンドウは閉じられませんでした。

メインウィンドウが開いたときにログインウィンドウを閉じる方法を書きましたが、それは動作しませんでした。

私には何が欠けていますか?

この

これはあなたがログインウィンドウを使用してサインインしている必要があります後、スレッド

Thread thread; 

@FXML 
private JFXProgressBar progress; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    progress.setProgress(0.0); 
    Runnable tasks = new TaskClass(); 
    thread = new Thread(tasks); 
    thread.start(); 
} 

上のプログレスバーをロードするタスククラス

public class TaskClass implements Runnable { 

    @Override 
    public void run() { 
     for (int i = 0; i < 100; i++) { 
      try { 
       progress.setProgress(i/100.0); 
       Thread.sleep(100); 

      } catch (InterruptedException ex) { 
       Logger.getLogger(RunningController.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       // this is the method that closes the window on which the progress bar is running 
       closed(clos); 
       // this is the method that opens the login 
       windowloadwindow("/inventory/management/login/InventoryManagementlogin.fxml", "DeMak Inventory"); 
      } 
     }); 
    } 
} 

あり、これが起こることを意味している

loadwindow("/inventory/management/ui/Main/main.fxml", "Deemax Inventory"); // a method that opens the main window 

closed(closew);  // a method that closes the login window 

答えて

0

Platform.runLater()コードとバックグラウンドスレッドコードを同期させるためには、以下のようCountDownLatchクラスを使用ウルド:

Task<Void> task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      for (int i = 0; i < 100; i++) { 
       final int finalCounter = i; 
       Platform.runLater(()->{ 
        try { 
         progress.setProgress(finalCounter/100.0); 
        } catch (InterruptedException e) { 
         Logger.getLogger(RunningController.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       }); 
       Thread.sleep(100); 
      } 
      return null; 
     } 
     @Override 
     protected void succeeded() { 
      // code here will be executed after the thread had been completed 
      Platform.runLater(()->{ 
       new Alert(Alert.AlertType.INFORMATION, "Thread Succeeded!").show(); 
      }); 
      closed(clos);  // this is the method that closes the window on which the progress bar is running 
      loadwindow("/inventory/management/login/InventoryManagementlogin.fxml", "DeMak Inventory");  // this is the method that opens the login window 
      super.succeeded(); 
     } 
     @Override 
     protected void failed() { 
      Platform.runLater(()->{ 
       new Alert(Alert.AlertType.ERROR, "Thread Failed!").show(); 
      }); 
      super.failed(); 
     } 
    }; 
    Thread thread = new Thread(task); 
    thread.start(); 

これは私のクローズ方法

  private void closed(Node nor) { 
     Stage stage = (Stage)nor.getScene().getWindow(); 
     stage.close(); 
     } 

これです:

Task<Void> task = new Task<Void>() { 
      @Override 
      protected Void call() throws Exception { 
       CountDownLatch sync = new CountDownLatch(1); 
       Platform.runLater(()->{ 
        // GUI code 
        // ... 
        // end of GUI code 
        sync.countDown(); 
       }); 
       sync.await(); // This method will wait for sync.countDown() to be executed 
       // ... 
       // code here will be executed after GUI code has finished 
       // ... 
       return null; 
      } 
     }; 
     Thread thread = new Thread(task); 
     thread.start(); 

しかしを、代わりに次のようにはるかに簡単にあなたの問題を解決することができます私のノードオブジェクトです....それはXイメージを含むvboxです

@FXML 
private VBox clos; 

私はこのような方法にノードを渡します。

+1

'Platform.later()'はバックグラウンドスレッドから呼び出すことができる 'updateProgress(...)'を使用し、進行状況バーをタスクのprogressプロパティにバインドすることで完全に回避することができます。これは、 'updateProgress()'を頻繁に呼び出しても、 'Platform.runLater()'への呼び出し回数を知的に制限するという利点があります。 –

+0

Nikiforos Archakis、私は試しましたが、サインイン後にログインウィンドウが閉じなくなりました –

+0

James D、本当にあなたがそのことを理解していません –

関連する問題