2015-02-17 6 views
0

У меня есть метод, который оценивает whats в строке с тем, что было установлено пользователем в ячейках TableView. (строка имеет такие значения, как «343288709789», и каждая ячейка содержит нулевое или однозначное число).TableView, управляющий вид отдельных ячеек

Это работает, однако теперь мне хотелось бы, чтобы TableView выделил (изменил фон или цвет текста) определенные ячейки, где пользователь установил неправильное значение. Как я могу добиться этого?

PS. Ive прочитал подобные вопросы к этому, но я не думаю, что могу добиться этого в реализации класса TableCell, потому что ячейки должны менять цвет только после использования, нажмите «Проверить».

private void compareAndEvaluate(String source, NewTableView newTableView){ 
    ObservableList<MyData> data = newTableView.getData(); 
    source = source.replaceAll("\\D+",""); 
    System.out.println("data size: " +data.size() + "\n\n" + source); 

    int numOfValid = 0, 
     numOfInvalid = 0; 
    ObservableList<ObjectProperty<Integer>> rowData; 
    for(int i=0, n=0; i < data.size(); i++){   //rows(Y) 
     rowData = data.get(i).returnCellsData(); 
     for(int j = 1; j < rowData.size(); ++j, ++n){ //columns(X) 
      Integer iNext = Integer.valueOf(String.valueOf(source.charAt(n))); 
      if(iNext == rowData.get(j).get()) 
       ++numOfValid; 
      else 
       ++numOfInvalid; 
     } 
    } 

    Dialogs.create().title("Results").masthead(null).message("Correct: " + numOfValid + ", Invalid: " + numOfInvalid).showInformation(); 
} 

Если это помогает, вот реализация TableCell используется TableView:

public class EditingCellNumbers extends TableCell<MyData, Integer>{ 
    private TextField textField; 
    private TableView<MyData> parentTableView; 

    public EditingCellNumbers(TableView<MyData> parent) { 
     this.parentTableView = parent; 
    } 

    @Override 
    public void startEdit(){ 
     if (!isEmpty()) { 
      super.startEdit(); 
      createTextField(); 
      setText(null); 
      setGraphic(textField); 
      textField.selectAll(); 
      textField.requestFocus(); 
     } 
    } 

    @Override 
    public void cancelEdit() { 
     super.cancelEdit(); 

     if(getItem() != null){ 
      setText(String.valueOf(getItem())); 
     }else{ 
      setText(null); 

      commitEdit(null); 
     } 
     setGraphic(null); 
    } 

    @Override 
    public void updateItem(Integer item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      if (isEditing()) { 
       if (textField != null) { 
        textField.setText(getString()); 
       } 
       setText(null); 
       setGraphic(textField); 
      } else {      
       setText(getString()); 
       setGraphic(null); 
       if(getTableColumn().getText() == "#"){ 
        setStyle("-fx-font-weight: bold;" 
          + "-fx-background-color: linear-gradient(from -100.0% 150.0% to 120.0% 100.0%, rgb(128,128,128) 0.0, rgb(255,255,255) 100.0);"); 
       }else{ 
        if(getItem() == null) 
         setStyle("-fx-border-color: lavender; -fx-border-width: 0 1 0 0;"); 
        else 
         setStyle("-fx-border-color: palegreen; -fx-border-width: 0 1 1 0;"); 
       } 
      } 
     } 
    } 

    private void createTextField() { 
     textField = new TextField(getString()); 
     textField.setStyle("-fx-background-color: ivory; -fx-border-color: red;"); 
     textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2); 
     textField.focusedProperty().addListener(
      (ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) -> { 
       if (!arg2) { 
        if(getItem() != null){ 
         try{ 
          commitEdit(Integer.valueOf(textField.getText())); 
         }catch(NumberFormatException f){ 
          commitEdit(null); 
         } 
        }else 
         commitEdit(null); 
       } 
     }); 
     textField.setOnKeyReleased(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent event) { 
       if(event.getCode() == KeyCode.BACK_SPACE){ 
        if(getItem() != null){ 
         numberOfEmptyCells.set(numberOfEmptyCells.get() + 1); 
         numberOfFilledCells.set(numberOfFilledCells.get() - 1); 
        } 
        commitEdit(null); 
       }else{ 
        try{ 
         int i = Integer.valueOf(textField.getText()); 
         //digit given... 
         if((i>=0) && (i<10)){//making sure cell is filled with just one digit 
          if(getItem() == null){ 
           numberOfEmptyCells.set(numberOfEmptyCells.get() - 1); 
           numberOfFilledCells.set(numberOfFilledCells.get() + 1); 
          } 
          commitEdit(Integer.valueOf(textField.getText())); 
          int selectedColumn = parentTableView.getSelectionModel().getSelectedCells().get(0).getColumn(); // gets the number of selected column 
          int selectedRow = parentTableView.getSelectionModel().getSelectedCells().get(0).getRow(); 
          //moving to another cell editing 
          if(selectedColumn < numberOfColumns-1){ 
           parentTableView.getSelectionModel().selectNext(); 
           parentTableView.edit(selectedRow, parentTableView.getColumns().get(selectedColumn+1)); 
          }else{ 
           parentTableView.getSelectionModel().select(selectedRow+1, parentTableView.getColumns().get(1)); 
           parentTableView.edit(selectedRow+1, parentTableView.getColumns().get(1)); 

          } 
         }else 
          textField.clear(); 
        }catch(NumberFormatException e){ 
         textField.clear(); 
        } 
       } 
      } 
     }); 
    } 

    private String getString() { 
     return getItem() == null ? "" : getItem().toString(); 
    } 
} 

} 

ответ

1

Вместо того, чтобы столбцы в модели данных Integer, сделать их какой-то объект, который хранит как целое и результат оценки. Используйте результат оценки, чтобы определить цвет ячейки в настраиваемом TableCell.

+0

Ive сделал это, добавив переменную класса данных с соответствующим (действительным) значением. Затем Ive сделал статический логический «переключатель», чтобы принять решение, или нет. Cell должен сравнивать свои данные с соответствующими значениями и действовать таким образом. Это очень важно, чтобы показать это в ответ. – Tomasz