2016-10-28 3 views
0

tablviewにdb-resultを表示したい。したがって、私は、動的に作成されたテーブルビューを持っている:javafxテーブルビューでツールチップを追加してテーブルセルの色を変更する

public void createTableView() throws Exception { 
    List<String> columnNames = new ArrayList<>(); 
    columnNames = test.getColumnNames(); 

    for (int i = 0; i < test.getColumnCount(); i++) { 
     TableColumn<ObservableList<String>,String> column = new TableColumn<>(columnNames.get(i)); 
     final int j = i; 

     column.setCellValueFactory(new Callback<CellDataFeatures<ObservableList<String>, String>, ObservableValue<String>>(){     
      public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> param) {                        
      return new SimpleStringProperty(param.getValue().get(j).toString());      
      } 
     }); 
     tableView.getColumns().add(column); 
    } 

は、DB-結果を追加します。

public void initializeTableView(List<List<String>> result) throws Exception { 
    ObservableList<ObservableList<String>> data = FXCollections.observableArrayList();  
    if (tableView.getColumns().size() == 0) { 
     createTableView(); 
    } 
    for (int i = 0; i < result.size(); i++) { 
     ObservableList<String> row = FXCollections.observableArrayList(); 
     row.addAll(result.get(i)); 
     data.add(row);  
    } 
    tableView.setItems(data); 

は今 - 私は同じテーブルビューに表示することを第二のDB-結果を得るイム。今度は、最初の結果リストと2番目の結果リストを比較したいと思います。値が等しくない場合は、最初の結果をツールチップに表示し、セルカラーを赤に変更します。

答えて

0

データを比較するカスタムTableCellを使用できます。もちろん、データ全体を2回保存しないほうが良いかもしれません。変更が疎である場合は、Mapを使用して元の値を保存するとメモリ効率は向上しますが、セルをスタイリングするというアイデアはまったく同じです。

例:

@Override 
public void start(Stage primaryStage) { 
    // create sample data 
    List<List<String>> result = Arrays.asList(
      Arrays.asList("a", "b"), 
      Arrays.asList("c", "d"), 
      Arrays.asList("e", "f"), 
      Arrays.asList("g", "h"), 
      Arrays.asList("i", "j") 
    ); 

    TableView<ObservableList<String>> tableView = new TableView<>(); 
    List<String> columnNames = Arrays.asList("column1", "column2"); 

    for (int i = 0; i < columnNames.size(); i++) { 
     TableColumn<ObservableList<String>, String> column = new TableColumn<>(columnNames.get(i)); 
     final int j = i; 

     column.setCellValueFactory((CellDataFeatures<ObservableList<String>, String> param) -> Bindings.stringValueAt(param.getValue(), j)); 

     // use custom cells 
     column.setCellFactory(tc -> new TableCell<ObservableList<String>, String>() { 

      private final Tooltip tooltip = new Tooltip(); 

      @Override 
      protected void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 

       if (empty) { 
        // clear the cell 
        setStyle(null); 
        setText(null); 
        setTooltip(null); 
       } else { 
        setText(item); 
        String original = result.get(getIndex()).get(j); 
        if (Objects.equals(original, item)) { 
         // same value as original -> no tooltip, no background 
         setStyle(null); 
         setTooltip(null); 
        } else { 
         // different -> red background + tooltip 
         setStyle("-fx-background-color: red;"); 
         setTooltip(tooltip); 
         tooltip.setText(original); 
        } 
       } 
      } 

     }); 
     tableView.getColumns().add(column); 
    } 

    ObservableList<ObservableList<String>> data = FXCollections.observableArrayList(); 

    for (int i = 0; i < result.size(); i++) { 
     ObservableList<String> row = FXCollections.observableArrayList(); 
     row.addAll(result.get(i)); 
     data.add(row); 
    } 
    tableView.setItems(data); 

    // do some modifications 
    data.get(0).set(1, "1"); 
    data.get(3).set(0, "3"); 

    Scene scene = new Scene(tableView); 

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

感謝。それはかなり良いです。 – sasch0112

関連する問題