Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx 具有自定义ListCell的ListView_Javafx_Scalafx - Fatal编程技术网

Javafx 具有自定义ListCell的ListView

Javafx 具有自定义ListCell的ListView,javafx,scalafx,Javafx,Scalafx,我正在学习scalaFX/JavaFX,作为一个热身,作为一个更大项目的一部分,我正在编写一个远程文件选择器。将列表视图绑定到可观察缓冲[文件]。但是我不想将File.toString作为文本,所以我想使用ListCell而不是扩展File。我没有找到任何这样的例子,所以我想我应该发布这个 这没关系,但我得到了Null文件,然后跳过Nulls时,列表中仍然有旧文件(如果更改前有x个文件,更改后有x个文件,则单元格中有旧数据) 最后,我为空文件添加了”,并从列表视图中删除了缺少的文件项。在List

我正在学习scalaFX/JavaFX,作为一个热身,作为一个更大项目的一部分,我正在编写一个远程文件选择器。将
列表视图
绑定到
可观察缓冲[文件]
。但是我不想将
File.toString
作为文本,所以我想使用
ListCell
而不是扩展
File
。我没有找到任何这样的例子,所以我想我应该发布这个

这没关系,但我得到了
Null
文件,然后跳过
Null
s时,列表中仍然有旧文件(如果更改前有x个文件,更改后有x个文件,则单元格中有旧数据)

最后,我为空文件添加了
,并从
列表视图中删除了缺少的文件项。在
ListView
API中,我看不到有人提到这一点

你觉得这样对吗?在我看来,应该有另一个地方来移除细胞。默认的
cellFactory
处理得很好

val fileList = new ListView[File](fileSystemModel.fileList) {
      cellFactory = { _ =>
        new ListCell[File] {
          item.onChange {
            (_, _, file) =>
              if (file != null) {
                text = s"${file.getName}${if (file.isDirectory) "/" else ""}"
              } else text = ""
          }
        }
      }
    }

这非常奇怪,但我做到了:

import javafx.scene.{control => jfxsc}

case class Item(name: String)

items = ... //ListView[Item]

items.cellFactory = (lv: ListView[Item]) => {
    new ListCell(new jfxsc.ListCell[Item] {
    override def updateItem(item: Item, empty: Boolean): Unit = {
        if (empty || item == null) {
            setText(null)
            setGraphic(null)
        } else {
            setText(item.name)
        }
    }
    })
}

这非常奇怪,但我做到了:

import javafx.scene.{control => jfxsc}

case class Item(name: String)

items = ... //ListView[Item]

items.cellFactory = (lv: ListView[Item]) => {
    new ListCell(new jfxsc.ListCell[Item] {
    override def updateItem(item: Item, empty: Boolean): Unit = {
        if (empty || item == null) {
            setText(null)
            setGraphic(null)
        } else {
            setText(item.name)
        }
    }
    })
}

我一点也不知道ScalaFX,但是你的代码看起来很奇怪。通常,当您对覆盖的单元格进行子类化,并遵循链接单元格Javadoc中概述的代码模式(调用super.updateItem并在更新过程中包含处理空单元格或空单元格的逻辑)时,如果未能正确执行此操作,通常会导致出现您提到的行为:“列表中仍有旧文件”.有时,仅仅使用Java就更清楚了。我正在从Scala编写JavaFX,有时需要一段时间才能从Java如何实现到Scala如何实现。到目前为止,我只有一次用Java扩展了一个类,你几乎总是可以给我们一个函数。我一点也不知道ScalaFX,但是你的代码看起来很奇怪。通常,当您对覆盖的单元格进行子类化,并遵循链接单元格Javadoc中概述的代码模式(调用super.updateItem并在更新过程中包含处理空单元格或空单元格的逻辑)时,如果未能正确执行此操作,通常会导致出现您提到的行为:“列表中仍有旧文件”.有时,仅仅使用Java就更清楚了。我正在从Scala编写JavaFX,有时需要一段时间才能从Java如何实现到Scala如何实现。到目前为止,我只有一次用Java扩展了一个类,你几乎总是可以给我们一个函数。这些应该是小细节的事情变成了大问题,其他的事情更容易在FX中工作。用Scala编写FX并没有那么繁琐。我确实喜欢scalaFX将代码组织成更像Scala的模式的方式。FX强制您使用与Swing相同的详细的、过程化的元素配置。最后我放弃了scalaFX。这些应该是小细节的事情变成了大问题,其他的事情更容易在FX中工作。用Scala编写FX并没有那么繁琐。我确实喜欢scalaFX将代码组织成更像Scala的模式的方式。FX强制您使用与Swing相同的详细的、过程化的元素配置。