cod*_*ody 2 javafx highlight tableview textflow
我从JavaFX 8开始阅读,您可以使用TextFlow来突出显示文本.但我不知道如何将它用于我的TableView.在我的控制器类中,我有这个:
TableView<Person> tvPerson;
TableColumn<Person, String> tcName;
ObservableList<Person> personList;
tcName.setCellValueFactory(new PropertyValueFactory<Person, String>("name"));
tvPerson.setItems(personList);
Run Code Online (Sandbox Code Playgroud)
这是内容类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
感谢帮助!
这有点晚了,但这是我的解决方案(确定它不是"最佳实践",但对我有用,到目前为止我还没有找到更好的东西)以防有人需要它.这只是一些部分:我认为在这种情况下更容易理解.请注意,该列不可编辑.为了使其可编辑,你需要在"返回新的TableCell()"中owervrite方法"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);
}
Run Code Online (Sandbox Code Playgroud)
希望它对某人有所帮助.
| 归档时间: |
|
| 查看次数: |
1405 次 |
| 最近记录: |