javafx - 使用 TextFlow 突出显示 TableView 中的文本

标签 javafx tableview highlight textflow

我从 JavaFX 8 开始阅读,您可以使用 TextFlow 来突出显示文本。但我不知道如何将它用于我的 TableView。在我的 Controller 类中,我有这个:

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

希望对某人有所帮助。

enter image description here

关于javafx - 使用 TextFlow 突出显示 TableView 中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23818097/

相关文章:

ios - 通过在 Collection View 单元格内按下按钮来实例化 Storyboard

swift - 核心数据详细 View 错误

mysql - 使用 InnoDB 修复 MySQL 高 CPU 使用率

c# - 使用 C# 在 RichTextBox 中突出显示语法

java - 将数据加载到TableView

jquery - 突出显示复选框

java - linux 上的干净部署 - java.lang.ClassNotFoundException : javafx. fxml.FXMLLoader

JavaFX 拖放到 GridPane?

mysql - 如何使用 Java 和 mysql 数据库 "wamp server"进行自动备份 [每天,每周,...]?

css - JavaFX 网格 Pane : Shrink if content is disabled and invisible