2016-10-28 4 views
0

Я хочу отобразить db-результат в tablview. Поэтому у меня есть динамически создаваемых TableView:Добавить подсказку и изменить цвет столбец в javafx tableview

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-результат, который I'm показывая в то же Tableview. Теперь я хочу сравнить первый результирующий список со вторым результирующим списком, и если значения не равны, я хочу показать первый результат в всплывающей подсказке и изменить цвет ячейки на красный.

ответ

0

Вы можете использовать пользовательский TableCell, который будет сравнивать данные. Конечно, лучше не хранить все данные дважды. В случае, если изменения разрежены, использование 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

Смежные вопросы