我读到,从 JavaFX 8 开始,您可以使用 TextFlow 来突出显示文本。但我不知道如何将它用于我的 TableView。在我的控制器类中,我有这个:
TableView<Person> tvPerson;
TableColumn<Person, String> tcName;
ObservableList<Person> personList;
tcName.setCellValueFactory(new PropertyValueFactory<Person, String>("name"));
tvPerson.setItems(personList);
这是内容类:
public class Person {
private final SimpleStringProperty name = new SimpleStringProperty("");
public Person(String name) {
setName(name);
}
public String getName() {
return name.getValue();
}
public void setName(String t) {
name.set(t);
}
}
感谢帮助!
有点晚了,但这是我的解决方案(当然这不是“最佳实践”,但对我有用,到目前为止我还没有找到更好的东西)以防有人需要它。这只是某些部分:我认为在这种情况下更容易理解。请注意,该列不可编辑。为了使其可编辑,您需要在“return new TableCell()”中写入方法“startEdit”、“cancelEdit”和“commitEdit”(它超出了这个问题主题)。
@FXML private TableView<YourEntity> table;
@Override
@SuppressWarnings("unchecked")
public void initialize(URL location, ResourceBundle resources) {
TableColumn column1 = new TableColumn(resources.getString("YourShowedColumnName"));
column1.setCellValueFactory(new PropertyValueFactory<>("YourDBColumnName"));
table.getColumns().setAll(column1, ..., .......);
table.setFixedCellSize(20.0); //To not change it in "graphic" with TextFlow
column1.setCellFactory(column -> {
return new TableCell<Mandant, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
setText(null);
setStyle("");
} else {
setGraphic(null);
if (!searchField.getText().isEmpty() && item.toLowerCase().contains(searchField.getText().toLowerCase())) {
Double rowHeight = this.getTableRow().getHeight();
setGraphic(buildTextFlow(item, searchField.getText()));
setHeight(rowHeight);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
} else {
setText(item);
setTextFill(Color.BLACK);
setStyle("");
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
}
}
};
table.setEditable(true);
/**
* Build TextFlow with selected text. Return "case" dependent.
*
* @param text - string with text
* @param filter - string to select in text
* @return - TextFlow
*/
private TextFlow buildTextFlow(String text, String filter) {
int filterIndex = text.toLowerCase().indexOf(filter.toLowerCase());
Text textBefore = new Text(text.substring(0, filterIndex));
Text textAfter = new Text(text.substring(filterIndex + filter.length()));
Text textFilter = new Text(text.substring(filterIndex, filterIndex + filter.length())); //instead of "filter" to keep "case"
textFilter.setFill(Color.ORANGE);
textFilter.setFont(Font.font("Helvetica", FontWeight.BOLD, 12));
return new TextFlow(textBefore, textFilter, textAfter);
}
希望这对某人有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)