2017-05-29 9 views
1

興味深い1つのタスクに興味がありました。私はUIをJavaFXに持っていて、UIを更新する別のスレッドを持っています。私はPlatform.runLaterから更新を開始しました。コード:JavafxスレッドからUIを更新するJava 8

private void startUpdateDaemon() { 
    updateUserStatus(); 
    updateTable(); 
} 

private void startUpdateDaemonTask() { 
    Task task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      while (true) { 
       Platform.runLater(() -> { 
        startUpdateDaemon(); 
       }); 
       Thread.sleep(1000); 
      } 
     } 
    }; 
    Thread th = new Thread(task); 
    th.setDaemon(true); 
    th.start(); 
} 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    startUpdateDaemonTask(); 
} 

はまた、私は、私はUIを更新し、別のクラスの場所を持っている:

だから、
private void startUpdateDaemonTask() { 
    Task task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      while (true) { 
       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         updateGameStatus(); 
        } 
       }); 
       Thread.sleep(1000); 
      } 
     } 
    }; 

    Thread th = new Thread(task); 
    th.setDaemon(true); 
    th.start(); 
} 

、最終的に私は、コール「Platform.runLater」と内部の異なる方法で2つの場所を持っています。 私の質問は、1つの時間呼び出し "Platform.runLater"で "one"メソッドのみを作成し、このメソッドにコールするさまざまなメソッドを送信できますか?私はコンシューマで仕上げメソッドを記述し、メソッド 'startUpdateDaemon()'と 'updateGameStatus()'をメソッドに送ることができますか? ありがとうございました。

答えて

3

Runnableパラメータをメソッドに追加できます。このパラメータは、あなたPlatform.runLaterに与えられる:

private void startUpdateDaemonTask(Runnable runner) { 
    Task task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      while (true) { 
       Platform.runLater(runner); 
       Thread.sleep(1000); 
      } 
     } 
    }; 

    Thread th = new Thread(task); 
    th.setDaemon(true); 
    th.start(); 
} 

今、あなたはあなたの方法を参照して、このメソッドを呼び出すことができます。

startUpdateDaemonTask(this::startUpdateDaemon); 
startUpdateDaemonTask(this::updateGameStatus); 
+0

どうもありがとう!良い方法。それだけが必要。 – Leo

関連する問題