大多数Qt,JavaFX或任何其他gui框架示例都说明了您可以使用各种小部件执行的操作,最终您将看到一个拖放或绘图示例,可以在其中移动形状或绘制某些内容在画布上。
对于更复杂的事物,形状的位置表示的事物(例如尊重尺寸的适当绘图工具),坐标的单位为“ mm”或“ inches”,或者可能存在于替代的坐标系,必须保持关系和约束,在这种情况下,诸如对其他形状的引用,历史记录等,等等,看来应用程序应该具有自己的内部事物模型,更适合于应用程序不仅仅是框架所需的场景图。也许应用程序希望将形状存储在数据库中而不是场景图中,或者出于任何原因,层次图都不适合该应用程序。
我猜这是MVC,MVVC等,通常用于文本和数据库内容,但是我还没有看到内部数据是恰好可以由框架正确表示的形状的任何示例。
所以问题是如何实现呢?
GUI元素的每次移动是否都应返回到管理应用程序内部这些对象内部表示的东西?并且是否应该从布局算法等每个状态更改为内部状态,从而导致整个update()
或redraw()
周期?
用两种方法表示事物似乎很浪费,即应用程序的正确模型和框架的模型,但是在框架级别管理应用程序逻辑似乎比较尴尬。
根据评论进行编辑,例如
我一直在极难得的“业余时间”内尝试在Clojure中实现原理图捕获工具。用户绘制了一个框,但是javafx.scene.shape.Rectangle
实际上表示为(defstruct Rectangle[])
。当我写/读磁盘时,我不想写实际的javafx.scene.shape.Rectangle
内存中二进制对象。我想编写诸如#Rectangle{posX #mm(10) posY #mm(13.2) width #mm(5) height #mm(6) #Color{0xaabbcc80} #StrokeWidth #mm(10)}
之类的edn格式,其中#mm
是我自己的结构,表示距离类型(可以转换为米,英寸等),而#Color
又是我自己的defstruct映射到javafx.scene.paint.Color
。我希望此数据结构成为应用程序内存中的“模型”,所以当我读/写时,我只是执行(read-string...)
或(pprint ...)
,而Clojure使用{{1}进行序列化/反序列化},*print-dup* true
和自定义阅读器地图。我有这部分工作。
但是,我想将javafx pprint
的各种属性绑定到我自己内部数据结构中的字段,因此,当用户四处移动内容时,应用程序的表示形式也会使用正确的单位进行更新。显然,有一个映射功能,可以将像素转换为毫米,英寸或其他大小,然后再返回。这种映射概念不仅适用于物理距离,而且还适用于其他Javafx图形属性,例如颜色,线宽,字体等。
后来,当我进入自动布局算法,了解引脚位置等信息时,我希望算法能够在内存应用程序模型上运行,而不是Rectangle
等上运行。因为这些值是双向绑定的,所以图形将在算法运行时更新。 TBD是否真的是个好主意。
所以这是将模型从视图中分离出来,完成了一百万次。
我想我只是想克服不得不代表两次的麻烦-一次在我的应用程序模型中,一次在框架模型中。我想我已经说服自己这是正确的路线。