要突出显示Table
我正在对其进行标记的文本部分,并告诉列渲染器拆分文本并在Labels
中将其呈现在HBox
中。不幸的是性能很差。当显示> 400线它变得非常慢。我怎样才能加快速度呢?
我使用以下代码突出显示Table
中包含多个HBoxes
的{{1}}的文字。但是一些Labels
显示省略号而不是文本。如何强制Labels
以全宽显示?
Labels
答案 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的工作量应该少得多,只需要渲染必要的部分。