TableView,管理特定单元格的外观

时间:2015-02-17 23:44:04

标签: tableview javafx-8 tablecell

我有一个方法,用TableView单元格中的用户设置的值来评估字符串中的内容。 (字符串的值类似于" 343288709789"并且每个单元格包含空或单个数字)。

它有效,但是现在我希望TableView突出显示(更改背景或文本颜色)用户设置错误值的某些单元格。我怎么能做到这一点?

PS。我已经阅读了类似的问题,但我不认为我可以在TableCell类实现中实现这一点,因为单元格只有在使用后才能改变颜色" Check"选项。

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();
}

如果有帮助,这里是TableView使用的TableCell的实现:

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 个答案:

答案 0 :(得分:1)

不要在数据模型中创建整数,而是使它们成为存储整数和评估结果的某种对象。使用评估结果确定自定义TableCell中单元格的颜色。