使用自定义列表单元格时 JavaFX ListView 呈现错误

标签 java listview javafx listviewitem

我正在创建一个 highlighting communication logger它使用 ListView 在单个单元格中显示每条消息。

enter image description here

它基本上可以工作,但是当我快速上下滚动时,会发生奇怪的事情。如您所见,我突出显示了当前选中的单元格和鼠标悬停的单元格。上下滚动后,突出显示的单元格不是我的鼠标指针所在的单元格,对于某些单元格,我无法通过单击选择它们。

我能够在一个非常简单的例子中重现这一点。假设我们有一个包含自定义 MyListCell 的字符串 ListView,使用 TextFlow 呈现这些单元格。 MyListCellupdateItem 方法如下所示

@Override
  protected void updateItem(String item, boolean empty) {

    super.updateItem(item, empty);

    if (empty || item == null) {
      setText(null);
      setGraphic(null);
      return;
    }

    TextFlow textFlow = new TextFlow(new Text(item));
    setGraphic(textFlow);
    setText(null);
  }

在初始化中,我只是创建了一个新的可观察字符串数组,并相应地设置了单元工厂:

public ObservableList<String > content = FXCollections.observableArrayList();
public ListView<String> listView;

@Override
public void initialize(URL location, ResourceBundle resources) {

    listView.setCellFactory(cb -> new MyListCell());
    listView.setItems(content);
    /* ... /*

完整的示例代码仅包含一些文件(您需要调整包路径):

问题:任何人都可以确认此行为并告诉我我做错了什么吗?

我的系统是 Ubuntu 14.04 和 Oracle jdk 1.8.0_25

最佳答案

基本上在 JavaFX 中创建一个新的 Node 并将其添加到 SceneGraph 是一项昂贵的操作。这就是为什么 ListView 使用虚拟化布局容器,在视口(viewport)更改时重用其单元格而不是创建新单元格。

您应该做的是在您的 ListCell 中重用 TextFlow 或换句话说:将其存储为成员属性并“仅”在 中设置其子项code>updateItem() 方法。

关于 TextFlowHBox:TextFlow 由于内置(单词)换行而具有相当复杂的布局机制。因此,如果 HBox 满足您的需求,您应该考虑使用它(当然是将其缓存在 ListCell 中)。

您可以尝试通过缓存 Text 节点来进一步提升这一点。但目前我无法为您提供一个简单的解决方案(JavaFX 中的 Node 只能包含在单个 Parent 节点中,所以一个简单的 WeakHashMap 使用 computeIfAbsent 缓存将不起作用)..

关于使用自定义列表单元格时 JavaFX ListView 呈现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27630194/

相关文章:

java - Hibernate 中的投影

java - 无法检测到测试类 : class path resource does not exist 的默认资源位置

java - 什么是有用的抽象/契约来协助 Builder 模式构建 MVC UI?

android - Admob 横幅隐藏 ListView fragment 的最后一项

java - 无法使用Retrofit在ListView中显示数据

android - 为什么我们在 android 中每个类使用单个适配器?

java - 可以使用 CDI 创建 mvvmFX 对象(View、ViewModel、Model)吗?

java - 尝试考虑 Java 中的任务栏会导致窗口大小不准确

java - 如何将 OpenJFX GA 发布版本与 github 标签版本匹配?

java - JavaFX音乐