gpt4 book ai didi

user-interface - JavaFX-如何创建简单的自定义绘制控件?

转载 作者:行者123 更新时间:2023-12-04 13:38:53 25 4
gpt4 key购买 nike

我已经完成了将图形网络编辑器应用程序编程为大学项目的任务。为此,我需要三种类型的项目/控件。圆形,矩形和用于连接其他形状的箭头(整个过程在某些方面类似于MS Visio)。形状/控件需要一些其他功能,例如移动,缩放上下文菜单等。另外,我还需要完全控制这些对象的图形表示,即我想自己“绘制”它们或至少能够在我进行修改时需要。

我正在使用JavaFX,对此几乎没有经验。所以我想知道,什么是实现这些自定义控件的最佳方法。必须使用JDK 7,因此不能选择使用SkinBaseBehaviourBase,因为它们在JDK 8之前是私有(private)的。

我正在考虑将PathCanvas子类化以用作控件。但是我对做出明智决定的含义了解得很少。

有人可以给我一些建议,要考虑哪些基类,以及可能有什么含义?

多谢。

最佳答案

这个答案仅供引用,这里没有真实的对错。咨询意见一定是有根据的,并不适用于所有情况,如果您不同意或不适用于您的情况,请忽略它。

抱歉,长度不够,但是问题是开放式的,潜在的答案很复杂。

I was thinking about subclassing Path or Canvas to use as my controls.



别。 Favor composition over inheritance。有一个控件类,该类实现控件的功能接口(interface),并且不管其背后的UI技术如何,都可以工作。向控件类提供对外观类的引用,该外观类是控件的UI表示形式。外观将指定如何在给定状态下呈现控件(从关联的控件对象获取控件状态)。同样,皮肤将是响应用户操作(例如鼠标按下)并指示控件根据鼠标按下来更改其状态的事物-因此,皮肤知道其与哪个控件相关联,反之亦然。在控件类中具有可绑定(bind)属性以表示控件状态。

一个简单的示例是此井字游戏实现中的 Square and SquareSkin

例如,想象一个复选框控件。控件的可绑定(bind)属性可能是状态为(选中,未选中,不确定)的枚举。皮肤可能会将复选框呈现为带有刻度线的方形框,以表示选中状态。或者,皮肤可以使用X渲染圆角边缘。皮肤可以使用您想要呈现复选框的任何技术,例如 Canvas 或节点集合。外观会为监听器注册鼠标单击,按键等的监听器,并告诉复选框控件设置其检查状态。它还在检查状态上具有一个监听器,并将基于该状态选择是否呈现检查标记。

关键在于,复选框的API接口(interface)只是具有检查状态的复选框控件类。从复选框API中抽象出处理UI的方式,因此您可以根据需要随意交换UI实现,而无需更改任何其他代码。

子类化Path与子类化Canvas完全不同。对于这种情况,我绝对希望继承一个Shape节点(或Region),而不是Canvas。使用Node,您将自动拥有一个非常丰富的UI渲染和事件模型,可绑定(bind)的属性集以及绘画框架,而Canvas则无法提供。如果您不使用节点,则最终可能会尝试以某种不合标准的方式重新创建和构建节点功能的某些部分。 Canvas非常适合诸如移植2D游戏或从其他框架绘制图形引擎或构建诸如粒子系统之类的像素操纵器之类的事情,但是要避免使用它。

考虑为您的控件外观使用布局 Pane ,例如一个StackPane或类似的东西。布局 Pane 是容器,因此您可以将内容放入其中,并使用聚合和组合来构建更复杂的控件。布局 Pane 还可以帮助您布置节点。

可以将所有子类化为Pane等区域的内容通过CSS设置为任意形状和颜色。实际上,这就是JavaFX中内置复选框(和其他控件)的工作方式。复选框是两个区域的堆栈,一个是复选框,另一个是复选框。两者都在CSS中设置样式-搜索JavaFX的 .check-box in the modena.css样式表。请注意如何通过指定svg路径(可以在svg编辑器(例如inkscape)中创建)来使用 -fx-shape来获得刻度线形状。还要注意如何使用背景分层来获得诸如聚焦环之类的东西。使用CSS进行样式设置的优点是,您可以在样式上更改控件而无需触碰Java代码。

so using SkinBase and BehaviourBase is not an option



即使您决定不使用这些基类(即使您仅针对Java 8+,这也是一个不错的决定),但我认为值得研究 JavaFX source中控件的设计是值得的。研究按钮或复选框,以便您可以查看专家如何进行此类操作。还要注意,由于您没有构建可重用的控件库,因此这种实现对于您的应用程序可能是过大的。您只需要可以在您的应用程序范围内正常工作的东西即可(这就是我不一定建议为所有应用程序扩展SkinBase的原因)。

至少为 read up on Controls on the open-jfx wiki

It is required to use JDK 7



IMO,开发针对Java 7的新JavaFX应用程序没有多大意义。针对Java 8的许多错误修复,以及添加的新功能和有用功能。通常,Java 7是JavaFX应用程序的次优目标平台。如果将应用程序打包为 self-contained application,则可以随应用程序一起交付所需的任何Java平台,因此目标平台无关紧要。

可以利用系统上预安装的Java运行时的IMO部署技术(例如WebStart或浏览器嵌入式应用程序(小程序))是传统的部署模式,大多数应用程序最好避免这种模式。

尽管如此,由于某些不可控制的限制,您仍然可能必须绝对拥有Java 7,因此我想只是针对您的情况进行仔细评估。如果您有这样的限制,并且必须在稳定的旧版UI工具包(可与多年前发布的运行时一起使用)的基础上构建,则可以始终使用Swing。

关于user-interface - JavaFX-如何创建简单的自定义绘制控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26656434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com