2016-09-23 12 views
0

ObservableListで表示するためにデータをデータベースから読み取ると、TableViewが反復処理を行うことは可能ですか?私は操作の各ラインを表示する前にしたいと思います。JavaFX、TableViewに表示されるデータの操作

1. operation on line 1 
2. display line 1 in tableview 
3. operation on line 2 
4. display line 2 in tableview 
... and so on. 

すべてがバックグラウンドスレッドで発生します(サービスまたはタスク?) 操作キーの存在を検索し、値を割り当てます。

TableViewでデータを編集するときにすべてがロードされると、ビュー全体が過負荷にならないようにスレッド内の1行だけを置換することができますか?すべての人にすばやくうまくやった。

+0

それはあなたが求めているものを完全には明らかではありません。データの一部を表示できるかどうかの質問がある場合は、答えは「はい」です。準備ができたら、テーブルの 'items'プロパティにデータを挿入してください。 – Itai

+0

'tableView.setItems(data);'このようにして、表示するデータを追加することができます。この場合、すべてを処理して表示するだけです。一度に処理するのではなく、行ごとに処理して表示したいと思います。可能性はありますか? – Bartek

+0

こうすることで、動的に選択された行を編集し、バックグラウンドでデータをスムーズにロック時間なしでロードすることができます – Bartek

答えて

0

私はあなたにいくつかのコードを準備しています。あなたが必要とするものであることを願っています。 一般的には、新しいスレッドを使用してTaskクラスを使用する必要があります。 ここでは、これについての詳細を読むことができます:https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm

public class Main extends Application { 
    private TableView<Person> table = new TableView<Person>(); 
    ArrayList<Person> listPerson = new ArrayList<>(); //this list can be filled from database 
    private ObservableList<Person> data; 

    public Main() { 
    listPerson.add(new Person("Ania")); 
    listPerson.add(new Person("Kasia")); 
    listPerson.add(new Person("Monika")); 
    listPerson.add(new Person("Jola")); 
    listPerson.add(new Person("Ewa")); 
    data = FXCollections.observableArrayList(listPerson); 
    } 


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

    @Override public void start(Stage stage) throws InterruptedException { 

    TableColumn firstNameCol = new TableColumn("First Name"); 
    firstNameCol.setMinWidth(100); 
    firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName")); 
    table.getColumns().addAll(firstNameCol); 

    final VBox vbox = new VBox(); 
    vbox.getChildren().addAll(table); 
    Scene scene = new Scene(vbox, 400, 400); 
    stage.setScene(scene); 
    stage.show(); 

    //Use new thread where you can proceed your data and add dynamically to the TableVIew 
    Task<Void> task = new Task<Void>() { 
     @Override protected Void call() throws Exception { 
     for (Person person : listPerson) { 
      System.out.println("Do something with person: " + person); 
      synchronized (this) { 
      this.wait(3000); 
      table.getItems().add(person); 
      System.out.println(person + " added to table. Do the next one \n"); 
      } 
     } 
     return null; 
     } 
    }; 

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

    public class Person { 
    private final SimpleStringProperty firstName; 

    public Person(String fName) { 
     this.firstName = new SimpleStringProperty(fName); 
    } 

    public String getFirstName() { 
     return firstName.get(); 
    } 

    public void setFirstName(String fName) { 
     firstName.set(fName); 
    } 

    @Override public String toString() { 
     return firstName.getValue(); 
    } 
    } 
} 

それは、この絵のように動作します:

enter image description here

+0

そして、それぞれの行が新しいスレッドをstowrzonyにしていた可能性はありますか?あなたが1つにすべてのものを持っていても、大量の行を読み込んでも少し時間がかかります。そして、その終わりがバックグラウンドで実行されるわけではありません。あなたがそれをロードするまでそれはすべて点滅します。セルは編集可能であり、すべてのデータをロードするのを待たずに簡単に編集する必要があります。 – Bartek

+0

私はあなたが欲しいものを正確に知りません。あなたは新しいスレッドで各行を読み込みたいですか?そして、データがロードされているときに、同時にこのデータを編集したいのですか?私の例では、wait(3000)を追加していましたが、それはゆっくりと動作しますが、通常、ViewTableを開いた後はすべてが表示され、読み込みが完了する。私はどのように私はあなたと連絡を取ることができます、多分それはより良いだろう磨かれた言語ではわからない) – BadVegan

関連する問題