具有突出显示文本(标签)的JavaFX表,性能较差

时间:2014-11-18 10:14:08

标签: performance javafx label

要突出显示Table我正在对其进行标记的文本部分,并告诉列渲染器拆分文本并在Labels中将其呈现在HBox中。不幸的是性能很差。当显示> 400线它变得非常慢。我怎样才能加快速度呢?

我使用以下代码突出显示Table中包含多个HBoxes的{​​{1}}的文字。但是一些Labels显示省略号而不是文本。如何强制Labels以全宽显示?

Labels

1 个答案:

答案 0 :(得分:2)

为了我的解决方案,你需要移动一些零件。特别是搜索和拆分的逻辑应该移出渲染器,因为它不是真正与GUI相关的工作。

因此,我们假设您的TableView的以下数据类(其中dataNumber和dataString)只是其他TableColumns的随机属性:

public class MyTableData {

private final IntegerProperty dataNumber = new SimpleIntegerProperty(this, "dataNumber");
private final StringProperty dataString = new SimpleStringProperty(this, "dataString");

private String temporarySearch = null;
private ObjectProperty<List<String>> searchMatches = null;

public ObjectProperty<List<String>> searchMatchesProperty() {
    if(searchMatches == null) {
        searchMatches = new SimpleObjectProperty<>(this, "searchMatches");
        doSearch();
    }
    return searchMatches;
}

public List<String> getSearchMatches() {
    if(searchMatches == null) {
        return Collections.emptyList(); // or return null
    }
    return searchMatchesProperty().get();
}

public void setSearchMatches(List<String> pSearchMatches) {
    searchMatchesProperty().set(pSearchMatches);
}

public void search(String pSearchTerm) {
    temporarySearch = pSearchTerm;
    doSearch();
}

private void doSearch() {
    if(temporarySearch != null && searchMatches != null) {
        //TODO perform the search and split here, putting the search match fragments as
        // List<String> to setSearchMatches(List)
    }
}
}

有趣的部分是searchMatches属性,只有在调用searchMatchesProperty()时才会初始化。 对search(String)的任何调用仅存储搜索词,但在属性初始化之前不会执行任何实际逻辑。

在Cell Renderer中,您将调用List<String> fragments = MyTableData.getSearchMatches();。 如果列表为空或为null(换句话说:属性未初始化)则不显示任何内容,将搜索结果的单元格留空。要么是因为没有匹配搜索词,要么因为属性没有初始化。

现在到ValueFactory: searchResultColumn.setCellValueFactory(p -> p.getValue().firstNameProperty()); TableView非常智能,不会将每个值都存储到内存中,只会将当前正在显示的值浸泡到内存中。因此,当其单元格变为可见时,您的搜索结果属性将被初始化。因此,CellRenderer的工作量应该少得多,只需要渲染必要的部分。