1
votes

I use the following code to have an editable table in my javafx code:

@FXML private TableView<Person> personTableGUI;
...

    PersonTableGUI.setEditable(true);

    ReadOnlyObjectProperty <Person> listener = ResourceTableGUI.getSelectionModel().selectedItemProperty();

    tableColumn.setCellFactory(TextFieldTableCell.forTableColumn());

    personIdTableGUI.setCellFactory(TextFieldTableCell.forTableColumn());    
    personIdTableGUI.setOnEditCommit((TableColumn.CellEditEvent<Person, String> t) -> {
            ((Person) t.getTableView().getItems().get(
                t.getTablePosition().getRow())
                ).setPersonId(t.getNewValue());

    personIdTableGUI.setCellValueFactory((cellData) -> cellData.getValue().personIdProperty());
    personNameTableGUI.setCellValueFactory(cellData -> cellData.getValue().personNameProperty());

I use the class Person:

public class Person{

    private StringProperty personId;
    private StringProperty personName;

I try to make the following: when the stringProperty personName is equal to "John" the relevant cell of the editable personIdTableGUI column to not be editable, how can i do that?

1

1 Answers

1
votes

You can subclass TextFieldTableCell in order to switch the editability when the item changes. So, for example:

personIdTableGUI.setCellFactory(col -> new TextFieldTableCell<Person, String>(TextFormatter.IDENTITY_STRING_CONVERTER) {
    @Override
    public void updateItem(String name, boolean empty) {
        super.updateItem(name, empty);
        if (empty) {
            setEditable(false);
        } else {
            Person rowValue = getTableView().getItems().get(getIndex());
            setEditable( ! "John".equals(rowValue.getPersonName()) );
        }
    }
});