我已经完成了将图形网络编辑器应用程序编程为大学项目的任务。为此,我需要三种类型的项目/控件。圆形,矩形和用于连接其他形状的箭头(整个过程在某些方面类似于MS Visio)。形状/控件需要一些其他功能,例如移动,缩放上下文菜单等。另外,我还需要完全控制这些对象的图形表示,即我想自己“绘制”它们或至少能够在我进行修改时需要。
我正在使用JavaFX,对此几乎没有经验。所以我想知道,什么是实现这些自定义控件的最佳方法。必须使用JDK 7,因此不能使用SkinBase
和BehaviourBase
,因为在JDK 8之前它们是私有的。
我在考虑子类化Path
或Canvas
用作控件。但是我对做出明智决定的含义了解得很少。
有人可以给我一些建议,要考虑哪些基类以及可能有什么含义?
多谢。
这个答案只是一个建议,这里没有真实的对错。建议一定是有根据的,并不适用于所有情况,如果您不同意该建议,或者它不适用于您的情况,请忽略它。
抱歉,长度不够,但是问题是开放式的,潜在的答案很复杂。
我正在考虑将Path或Canvas子类化以用作控件。
别。偏爱继承而非继承。有一个控件类,该类实现控件的功能接口,并且不管其背后的UI技术如何,都可以工作。向控件类提供对外观类的引用,该外观类是控件的UI表示形式。外观将指定如何在给定状态下呈现控件(从关联的控件对象获取控件状态)。同样,皮肤将是响应用户操作(例如鼠标按下)并指示控件根据鼠标按下来更改其状态的事物-因此,皮肤知道其与哪个控件相关联,反之亦然。在控件类中具有可绑定属性以表示控件状态。
一个简单的示例是此井字游戏实现中的Square和SquareSkin。
例如,想象一个复选框控件。控件的可绑定属性可能是状态为(选中,未选中,不确定)的枚举。皮肤可能会将复选框呈现为带有刻度线的方形框,以表示选中状态。或者,皮肤可以使用X渲染圆角边缘。皮肤可以使用您想要呈现复选框的任何技术,例如画布或节点集合。外观会为侦听器注册鼠标单击,按键等的侦听器,并告诉复选框控件设置其检查状态。它还在检查状态上具有一个侦听器,并将基于该状态选择是否呈现检查标记。
关键是复选框的API接口只是具有复选框状态的复选框控件类。UI的处理方式是从复选框API中抽象出来的,因此您可以随意更改UI实现,而无需更改任何其他代码。
子类化Path与子类化Canvas完全不同。对于这种情况,我绝对希望继承一个Shape节点(或Region),而不是Canvas。使用Node,您将自动拥有一个非常丰富的UI渲染和事件模型,可绑定的属性集以及绘画框架,而Canvas则无法提供。如果您不使用节点,则最终可能会尝试以某种不合标准的方式重新创建和构建节点功能的某些部分。Canvas非常适合诸如移植2D游戏或从其他框架绘制图形引擎或构建诸如粒子系统之类的像素操纵器之类的东西,但是要避免使用它。
考虑为您的控件外观使用布局窗格,例如StackPane或类似的东西。布局窗格是容器,因此您可以将内容放入其中,并使用聚合和组合来构建更复杂的控件。布局窗格还可以帮助您布置节点。
可以将所有子类化为Pane等区域的内容通过CSS设置为任意形状和颜色。实际上,这就是JavaFX中内置复选框(和其他控件)的工作方式。复选框是两个区域的堆栈,一个是复选框,另一个是复选框。两者都在CSS中设置样式-在JavaFX的modena.css样式表中搜索.check-box。请注意如何-fx-shape
通过指定svg路径(可以在svg编辑器(例如inkscape)中创建路径)来获得刻度线形状。还要注意如何使用背景分层来获取诸如聚焦环之类的东西。使用CSS设置样式的优点是您可以在样式上更改控件而无需触碰Java代码。
所以不能使用SkinBase和BehaviourBase
即使您决定不使用这些基类(即使您仅针对Java 8+,这也是一个不错的决定),但我认为值得研究JavaFX源代码中控件的设计。研究按钮或复选框,以便您可以查看专家如何进行此类操作。还要注意,这样的实现对于您的应用程序可能是过大的,因为您没有构建可重用的控件库。您只需要一些可以在您的应用程序范围内正常运行的东西(这就是我不一定建议为所有应用程序扩展SkinBase的原因)。
需要使用JDK 7
IMO,开发针对Java 7的新JavaFX应用程序没有多大意义。Java8修复了许多错误,并添加了新的有用功能。通常,Java 7是JavaFX应用程序的次优目标平台。如果将应用程序打包为自包含应用程序,则可以随应用程序一起提供所需的任何Java平台,因此目标平台无关紧要。
可以使用系统上预安装的Java运行时的IMO部署技术(例如WebStart或浏览器嵌入式应用程序(小程序))是传统的部署模式,大多数应用程序最好避免这种模式。
尽管如此,由于某些不可控制的限制,可能仍然存在绝对必须安装Java 7的情况,所以我想只是针对您的情况进行仔细评估。如果您有这样的限制,并且必须在稳定的旧版UI工具包(可与多年前发布的运行时一起使用)上构建,则可以始终使用Swing。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句