我一直在尝试找出允许 JavaFX TableView(或任何其他 JavaFX 事物)表示一些 Clojure 数据并允许用户通过 GUI 操作数据的方法。
对于这个讨论,假设我有一个 map 列表/矢量,即类似[{:col1 "happy1" :col2 "sad1"} {:col1 "happy2" :col2 "sad2"}]
我希望它显示在图形表中,如下所示:
mykey1 mykey2
------------------
happy1 sad1
happy2 sad2
很简单。这在世界历史上已经完成了无数次。
问题是 TableView 坚持要取一个 ObservableList 等,这本质上是一个可变的东西,JavaFX 中的所有 Observable 也是如此。这对于使表保持最新非常有用,并且在可变模型中,对于允许用户通过 GUI 直接操作数据也非常有用。我不是专家,但在这种情况下,JavaFX 似乎希望 GUI 对象实际包含真实数据。这对我来说似乎很有趣(不是哈哈)。维护我自己的模型并通过一些 API 或接口(interface)在 GUI 和模型之间进行通信也意味着我在两个地方维护数据:在我自己的模型中和在 GUI 中。这是正确的做事方式吗?也许这没关系,因为 GUI 只显示总数据的一小部分,它让我的模型数据只是普通的模型数据,而不是某些 Java 派生类型的实例。
因此,当尝试将 GUI 置于无状态/不可变模型上时,这会导致以下三个一般问题:
Atom
或其他 Clojure 可变类型 (ref/var/agent/etc)(无论是包含整个内存设计数据库的单个 Atom
,还是设计数据库是可变 Atoms
的不可变列表), [MVP、MCP、MVVM 等] 模型最适合这种类型的创作? Observable[whatever]Value
,例如包括 ObservableMap
和 ObservableMapValue
,然后是几十个实现类,例如 IntegerProperty
和 SimpleIntegerProperty
……天哪! wtf?。假设我必须创建一些 Clojure 对象( defrecord
等)并实现一些 Observable
我的大部分不可变对象(immutable对象)上的接口(interface)方法,我可以坚持使用Observable
吗? ,或者我必须将每一个都实现到叶节点,即ObservableIntegerValue
, ETC。? 什么是正确的高级方法?维护一个每次用户更改值时都会被替换的顶级原子?维持一千个低级原子?让我的值作为 JavaFX Observables 存在,而忘记 Clojure 数据结构?使用一些 reify/proxy/gen-class 在 Clojure 中实现我自己的一组 Observables,但将它们实现为每次更改时都会被替换的不可变对象(immutable对象)? Clojure 的
add-watch
是否有需要或地方?功能?我非常希望我的数据只是 Clojure 中的普通数据,而不是“类型”或任何接口(interface)的实现。整数应该是整数等。谢谢
最佳答案
我会在原子上添加一个 watch ,然后根据差异更新您的可观察对象。
http://clojuredocs.org/clojure.core/add-watch
关于clojure - JavaFX 和 Clojure : binding observables to immutable objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069754/