Tomasz Mularczyk
Tomasz Mularczyk

Reputation: 36179

TableView, managing look of particular cells

I got a method which evaluates whats in the string with what was set by user in TableView cells. (string have values like "343288709789" and each cell contains null or single digit number).

It works, however now I would like TableView to highlight(change background or text color) certain cells where user set wrong value. How can I achive this?

PS. Ive read similiar questions to this but I dont think I can achieve this in TableCell class implementation, because cells should change color only after uses press "Check" option.

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

If that helps, here is implementation of TableCell used by 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();
    }
}

}

Upvotes: 0

Views: 46

Answers (1)

DaveB
DaveB

Reputation: 2143

Instead of making your columns in your data model Integer, make them some kind of an object that stores both the integer and the evaluation result. Use the evaluation result to determine the colour of the cell in your customized TableCell.

Upvotes: 1

Related Questions