2015-02-17 58 views
0

我收到了一个方法,用于评估用户在TableView单元格中设置的字符串中的内容。 (字符串的值为“343288709789”,每个单元格包含空或单个数字)。TableView,管理特定单元格的外观

它的工作原理,但现在我想让TableView突出显示(更改背景或文本颜色)用户设置错误值的某些单元格。我怎样才能做到这一点?

PS。我读过类似的问题,但我不认为我可以在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

而不是在数据模型中整数让你列,让他们某种存储两个整数对象和评估结果。使用评估结果来确定自定义TableCell中单元格的颜色。

+0

我通过添加Data Class变量和相应的(有效)值来实现它。然后,我制作了静态布尔“开关”来决定是否Cell与其数据对比,并通过该数据行事。它对很多明显的变化表明它在回答中。 – Tomasz 2015-02-18 18:55:44