2016-05-19 13 views
0

私は何をしたいのかの簡単な例を提供します。JavaFX:カプセル化された変数からのサービスクラス更新メッセージ

私は3つのプライベートメソッドを持つコントローラー、持っている:

private void before(){ 
//value = "Start"; 
//do something 
//value = "Credentials are OK"; 
} 

private void process(){ 
//value = "In process.." 
//do smg 
//value = "..."; 
} 

private void after(){ 
//similar body 
} 

をそして、私はこれらの3つの方法をカプセル化し、公開する方法があります:

public void install(){ 
before(); 
process(); 
after(); 
} 

を、これはメソッドをインストールするには、バックグラウンドスレッドで使用されます。

backgroundThread = new Service<Void>() { 
       @Override 
       protected Task<Void> createTask() { 
        return new Task<Void>() { 
         @Override 
         protected Void call() throws Exception { 
          String statusArea = ""; 
          Controller.install(); 
            updateMessage(/*Here I want to put value variable from my Controller class*/); 
           } 
          } 
          return null; 
         } 
        }; 
       } 
      }; 


      backgroundThread.setOnSucceeded(event -> { 
       System.out.println("Done!"); 
       updateStatusArea.textProperty().unbind(); 
      }); 

      updateStatusArea.textProperty().bind(backgroundThread.messageProperty()); 

したがって、value変数がchaになるとすぐにstatusAreaを更新したいと思いますnged。どうやってやるの?

答えて

1

これがあなたのために仕事をしていません。:

package application; 

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.concurrent.Service; 
import javafx.concurrent.Task; 
import javafx.stage.Stage; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.TabPane; 
import javafx.scene.control.TextArea; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 


public class Main extends Application { 

    private TextArea textArea; 
    public SimpleStringProperty valueProperty = new SimpleStringProperty(); 
    private Service<Void> service; 

    private void before(){ 
     valueProperty.set("Start"); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     valueProperty.set("Credentials are OK"); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     } 

     private void process(){ 
      valueProperty.set("In process.."); 
      try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
      valueProperty.set("..."); 
     } 

     private void after(){ 
     //similar body 
     } 

     public void install(){ 
      before(); 
      process(); 
      after(); 
      } 

    @Override 
    public void start(Stage primaryStage) { 

     Group root = new Group(); 
     Scene scene = new Scene(root, 450, 250, Color.WHITE); 

     textArea = new TextArea(); 

     service = new Service<Void>() { 

      @Override 
      protected Task<Void> createTask() { 
       return new Task<Void>() { 
        @Override 
        protected Void call() throws Exception { 

         Main.this.valueProperty.addListener(new ChangeListener<String>() { 
          @Override 
          public void changed(ObservableValue<? extends String> observable, String oldValue, 
            String newValue) { 
           updateMessage(newValue); 
          } 
         }); 
         Main.this.install(); 


         return null; 
        } 
       }; 
      } 

     }; 
     textArea.textProperty().bind(service.messageProperty()); 

     service.setOnSucceeded(event -> { 
      System.out.println("Done!"); 
      textArea.textProperty().unbind(); 
     }); 

     service.start(); 

     VBox vbox = new VBox(); 
     vbox.getChildren().addAll(textArea); 
     vbox.fillWidthProperty().set(true); 
     root.getChildren().add(vbox); 



     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

私は理解していない一つのこと、あなたが直接値を持っているとして、あなたは、GUI要素にスレッドのメッセージをバインドしたいなぜあなたのオブジェクト。

私が言うのであれば、それは同じことを動作します。

textArea.textProperty().bind(valueProperty); 

ではなく

textArea.textProperty().bind(service.messageProperty()); 
+0

はあなたに感謝!それをチェックして受け入れるつもり! – quento

関連する問題