2017-03-22 14 views
0

私はJavafxと一緒に作業しています。バックグラウンドタスクを使用して更新する際にソートされたテーブルを取得するのに苦労しています。スタンドアロンで実行できるコードhereでは、バックグラウンドでテーブルを更新します。JavaFX TableView:ソートされたアイテムを表示+バックグラウンドタスク

私がしたいのは、このテーブルが更新され、時間順にソートされているため、古い列車の時間が上に表示され、後の列が下に表示されるということです。この例では、ソートが機能するかどうかを確認する目的で、反対の順序の時間を生成します。

私はテーブルへの同時更新を追加する前に、私はいくつかのテストを実行し、私はそれを行うような方法は、呼び出すことにより、次のとおりです。

private final ObservableList<StationBoardLine> data = FXCollections.observableArrayList(
     new StationBoardLine("RE", "17:14", "Basel Bad Bf", "Basel SBB", "+3", "RE 5343")); 
SortedList<StationBoardLine> sorted = new SortedList<>(data, new DelayComparator()); 
table.setItems(sorted); 

しかし、今、私は設定項目が、バックグラウンドを使用していませんよタスクにReadOnlyObjectPropertyReadOnlyObjectWrapperを追加して追加します。

私の質問は、アイテムが追加されるとリストが注文されたままであることを確認する方法です。私はPlatform.runLaterへの呼び出しの中でリストを並べ替えることができるかどうか試しましたが、うまくいきませんでした。

テーブルと設定されているテーブルを更新するタスク間のリンクはこちらです:助けを

table.itemsProperty().bind(task.partialResultsProperty()); 

おかげで、

ギャルダー

答えて

1

それが更新することである私はどうなる方法ObservableListをバックグラウンドタスクで作成し、それを「ソース」として使用してSortedListを作成します。このSortedListは、TableViewの「アイテム」のソースとして機能します。

一般的な構造は次のようになります。あなたのシナリオでは

public class MyClass { 

    private TableView<T> tableView = new TableView; 
    private ObservableList<T> sourceList = FXCollections.observableArrayList(); 

    public MyClass() { 
     ... 
     SortedList<T> sortedList = new SortedList<>(sourceList, new MyComparator()); 
     tableView.setItems(sortedList); 

     ... 

     new Task<Void> { 
      protected Void call() { 
      ... // Some background data fetch 
      Platform.runLater(() -> sourceList.add(data)); 
      return null; 
      } 
     }; 
    } 
} 

を、私はあなたが既に持っている何かで行くだろう。したがって、SortedListのソースとして使用する新しいObservableListを作成する代わりに、Task#getPartialResults()によって返されたリストを使用します。

DelayComparatorは遅延の値を使用して、TableViewのデータを比較して表示します。

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.collections.transformation.SortedList; 
import javafx.concurrent.Task; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

import java.util.Comparator; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class App extends Application { 

    private TableView<StationBoardLine> table = new TableView<>(); 
    private final ExecutorService exec = Executors.newSingleThreadExecutor(); 

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

    @Override 
    public void start(Stage stage) { 
     BorderPane root = new BorderPane(); 
     Scene scene = new Scene(root, 800, 600); 

     table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
     table.setEditable(true); 

     TableColumn typeCol = getTableCol("Type", 10, "type"); 
     TableColumn departureCol = getTableCol("Departure", 30, "departure"); 
     TableColumn stationCol = getTableCol("Station", 200, "station"); 
     TableColumn destinationCol = getTableCol("Destination", 200, "destination"); 
     TableColumn delayCol = getTableCol("Delay", 20, "delay"); 
     TableColumn trainName = getTableCol("Train Name", 50, "trainName"); 

     table.getColumns().addAll(
       typeCol, departureCol, stationCol, destinationCol, delayCol, trainName); 

     root.setCenter(table); 

     PartialResultsTask task = new PartialResultsTask(); 
     SortedList<StationBoardLine> sorted = new SortedList<>(task.getPartialResults(), new DelayComparator()); 
     table.setItems(sorted); 
     exec.submit(task); 

     stage.setTitle("Swiss Transport Delays Board"); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    private TableColumn getTableCol(String colName, int minWidth, String fieldName) { 
     TableColumn<StationBoardLine, String> typeCol = new TableColumn<>(colName); 
     typeCol.setMinWidth(minWidth); 
     typeCol.setCellValueFactory(new PropertyValueFactory<>(fieldName)); 
     return typeCol; 
    } 

    static final class DelayComparator implements Comparator<StationBoardLine> { 

     @Override 
     public int compare(StationBoardLine o1, StationBoardLine o2) { 
      return o1.getDelay().compareTo(o2.getDelay()); 
     } 

    } 

    public class PartialResultsTask extends Task<Void> { 

     private ObservableList<StationBoardLine>partialResults = FXCollections.observableArrayList(); 
     public final ObservableList<StationBoardLine> getPartialResults() { 
      return partialResults; 
     } 

     @Override protected Void call() throws Exception { 
      System.out.println("Creating station board entries..."); 
      for (int i=5; i >= 1; i--) { 
       Thread.sleep(1000); 
       if (isCancelled()) break; 
       StationBoardLine l = new StationBoardLine(
         "ICE", "16:" + i, "Basel Bad Bf", "Chur", String.valueOf(i), "ICE 75"); 
       Platform.runLater(() -> partialResults.add(l)); 
      } 
      return null; 
     } 
    } 

    public static final class StationBoardLine { 
     private final SimpleStringProperty type; 
     private final SimpleStringProperty departure; 
     private final SimpleStringProperty station; 
     private final SimpleStringProperty destination; 
     private final SimpleStringProperty delay; 
     private final SimpleStringProperty trainName; 

     StationBoardLine(String type, 
         String departure, 
         String station, 
         String destination, 
         String delay, 
         String trainName) { 
      this.type = new SimpleStringProperty(type); 
      this.departure = new SimpleStringProperty(departure); 
      this.station = new SimpleStringProperty(station); 
      this.destination = new SimpleStringProperty(destination); 
      this.delay = new SimpleStringProperty(delay); 
      this.trainName = new SimpleStringProperty(trainName); 
     } 

     public String getType() { 
      return type.get(); 
     } 

     public SimpleStringProperty typeProperty() { 
      return type; 
     } 

     public void setType(String type) { 
      this.type.set(type); 
     } 

     public String getDeparture() { 
      return departure.get(); 
     } 

     public SimpleStringProperty departureProperty() { 
      return departure; 
     } 

     public void setDeparture(String departure) { 
      this.departure.set(departure); 
     } 

     public String getStation() { 
      return station.get(); 
     } 

     public SimpleStringProperty stationProperty() { 
      return station; 
     } 

     public void setStation(String station) { 
      this.station.set(station); 
     } 

     public String getDestination() { 
      return destination.get(); 
     } 

     public SimpleStringProperty destinationProperty() { 
      return destination; 
     } 

     public void setDestination(String destination) { 
      this.destination.set(destination); 
     } 

     public String getDelay() { 
      return delay.get(); 
     } 

     public SimpleStringProperty delayProperty() { 
      return delay; 
     } 

     public void setDelay(String delay) { 
      this.delay.set(delay); 
     } 

     public String getTrainName() { 
      return trainName.get(); 
     } 

     public SimpleStringProperty trainNameProperty() { 
      return trainName; 
     } 

     public void setTrainName(String trainName) { 
      this.trainName.set(trainName); 
     } 
    } 
} 
+0

すばやく返信いただきありがとうございます。あなたの提案はうまくいくようです:D –

関連する問題