Source:
private void initialize() { visualizer.setDecoration(new IconValidationDecorator()); btnHelp.setGraphic(JabRefIcons.HELP.getGraphicNode()); btnHelp.setTooltip(new Tooltip(Localization.lang("Open Help page"))); btnNewString.setTooltip(new Tooltip(Localization.lang("New string"))); btnRemove.setTooltip(new Tooltip(Localization.lang("Remove selected strings"))); colLabel.setCellValueFactory(cellData -> cellData.getValue().labelProperty()); new ViewModelTextFieldTableCellVisualizationFactory<BibtexStringViewModel, String>().withValidation(BibtexStringViewModel::labelValidation, visualizer).install(colLabel, new DefaultStringConverter()); colContent.setCellValueFactory(cellData -> cellData.getValue().contentProperty()); new ViewModelTextFieldTableCellVisualizationFactory<BibtexStringViewModel, String>().withValidation(BibtexStringViewModel::contentValidation, visualizer).install(colContent, new DefaultStringConverter()); colLabel.setOnEditCommit((CellEditEvent<BibtexStringViewModel, String> cell) -> { String newLabelValue = cell.getNewValue(); if (cell.getTableView().getItems().stream().anyMatch(strs -> strs.labelProperty().get().equals(newLabelValue))) { dialogService.showErrorDialogAndWait(Localization.lang("A string with the label '%0' already exists", newLabelValue)); cell.getRowValue().setLabel(""); } else { cell.getRowValue().setLabel(cell.getNewValue()); } }); colContent.setOnEditCommit((CellEditEvent<BibtexStringViewModel, String> cell) -> { cell.getRowValue().setContent(cell.getNewValue()); }); tblStrings.itemsProperty().bindBidirectional(viewModel.allStringsProperty()); tblStrings.setEditable(true); viewModel.seletedItemProperty().bind(tblStrings.getSelectionModel().selectedItemProperty()); }

Target:
private void initialize() { visualizer.setDecoration(new IconValidationDecorator()); btnHelp.setGraphic(JabRefIcons.HELP.getGraphicNode()); btnHelp.setTooltip(new Tooltip(Localization.lang("Open Help page"))); btnNewString.setTooltip(new Tooltip(Localization.lang("New string"))); btnRemove.setTooltip(new Tooltip(Localization.lang("Remove selected strings"))); colLabel.setCellValueFactory(cellData -> cellData.getValue().labelProperty()); new ViewModelTextFieldTableCellVisualizationFactory<BibtexStringViewModel, String>().withValidation(BibtexStringViewModel::labelValidation, visualizer).install(colLabel, new DefaultStringConverter()); colContent.setCellValueFactory(cellData -> cellData.getValue().contentProperty()); new ViewModelTextFieldTableCellVisualizationFactory<BibtexStringViewModel, String>().withValidation(BibtexStringViewModel::contentValidation, visualizer).install(colContent, new DefaultStringConverter()); colLabel.setOnEditCommit((CellEditEvent<BibtexStringViewModel, String> cell) -> { String newLabelValue = cell.getNewValue(); if (cell.getTableView().getItems().stream().anyMatch(strs -> strs.labelProperty().get().equals(newLabelValue))) { dialogService.showErrorDialogAndWait(Localization.lang("A string with the label '%0' already exists.", newLabelValue)); cell.getRowValue().setLabel(""); } else { cell.getRowValue().setLabel(cell.getNewValue()); } }); colContent.setOnEditCommit((CellEditEvent<BibtexStringViewModel, String> cell) -> { cell.getRowValue().setContent(cell.getNewValue()); }); tblStrings.itemsProperty().bindBidirectional(viewModel.allStringsProperty()); tblStrings.setEditable(true); viewModel.seletedItemProperty().bind(tblStrings.getSelectionModel().selectedItemProperty()); }