代码之家  ›  专栏  ›  技术社区  ›  Sonicsmooth

构建图形桌面应用程序

  •  0
  • Sonicsmooth  · 技术社区  · 7 年前

    qt、javafx或任何其他gui框架的大多数示例显示了您可以使用各种小部件执行的操作,最终您将看到一个拖放或绘图示例,您可以在其中移动形状,或在画布上绘制一些东西。

    对于更复杂的东西,形状的位置 意思是 一些东西,如一个适当的绘图工具,其中的尺寸是尊重的,坐标有“毫米”或“英寸”等单位,或可能存在于一个替代坐标系中,关系和约束必须保持,其中有其他形状的参考,历史等,它似乎应用程序应该有自己的内部模型,比框架所需的场景图更适合应用程序。也许应用程序希望将形状存储在数据库而不是场景图中,或者由于某种原因层次图不是应用程序的正确模型。

    我猜这是mvc、mvvc等,通常是针对文本和数据库的,但是我没有看到任何内部数据是恰好可以由框架表示的形状的例子。

    所以问题是如何实现这一点?

    gui元素的每次移动都应该调用管理应用程序对这些对象的内部表示的东西吗?如果每一个改变到内部状态,从说一个布局算法,因此导致 update() redraw() 周期?

    有两种表示方式——应用程序的适当模型和框架的模型——似乎是浪费,但在框架级别管理应用程序逻辑似乎更为尴尬。


    从评论中编辑例如

    在我难得的“空闲时间”里,我一直试图在clojure中实现一个示意图捕获工具。用户绘制一个框,但是 javafx.scene.shape.Rectangle 实际上表示为 (defstruct Rectangle[]) . 当我写入/读取磁盘时,我不想写入实际的 javafx.scene.shape.矩形 内存中的二进制对象。我想写一个edn格式,比如 #Rectangle{posX #mm(10) posY #mm(13.2) width #mm(5) height #mm(6) #Color{0xaabbcc80} #StrokeWidth #mm(10)} 在哪里? #mm 是我自己的结构,表示距离类型(可以转换为米、英寸等)。 #Color 又是我自己的destruct映射到 javafx.scene.paint.Color . 我希望这个数据结构是应用程序内存中的“模型”,所以当我读/写时,我只做一个 (read-string...) (pprint ...) ,并使用clojure序列化/反序列化 *print-dup* true , pprint ,以及自定义读取器映射。我让这部分工作。

    但是我想绑定javafx Rectangle 我自己内部数据结构中字段的各种属性,因此当用户移动内容时,应用程序的表示也会更新,使用正确的单位。很明显,有一个映射函数,它将像素移到毫米、英寸,然后再移回来。这种映射概念不仅适用于物理距离,还适用于任何其他javafx图形属性,如颜色、线宽、字体等。

    稍后,当我谈到自动布局的算法,知道管脚位置在哪里等时,我希望算法在内存中的应用程序模型上工作,而不是 javafx...Rectangle 诸如此类。因为这些值是双向绑定的,所以图形将在算法运行时更新。这是否真的是个好主意有待商榷。

    所以这是模型和视图的分离,做了一百万次。

    我想我只是想克服两次表示的困难——一次在我的应用程序模型中,一次在框架模型中。我想我已经说服自己这是正确的路线。

    0 回复  |  直到 7 年前
    推荐文章