2014-10-30 109 views
4

我有任务将图形化网络编辑器应用程序编程为大学项目。为此,我需要三种类型的物品/控件。一个圆形,一个矩形和箭头连接其他形状(整个事情有点像MS Visio在某些方面)。形状/控件需要一些额外的功能,例如移动,缩放上下文菜单等。另外,我需要完全控制这些对象的图形表示,即我想自己“绘制”它们,或者至少能够将它们修改为I需要。JavaFX - 如何创建简单的自定义绘制控件?

我正在使用JavaFX,对它几乎没有任何经验。所以我想知道,什么是实现这些自定义控件的最佳方式。它是需要使用JDK 7,因此,使用SkinBaseBehaviourBase是不是一种选择,因为它们是私人JDK 8之前

我在想继承PathCanvas作为我的控制使用。但我对知情决策的含义知之甚少。

有人可以给我一些建议,哪些基类要考虑和可能有什么影响?

Thx很多。

回答

11

这个答案只是要咨询,有没有真正的正确或错误的答案在这里。如果你不同意这个建议,或者这个建议不适用于你的情况,你可以忽略它。

对不起,但问题是开放式的,可能的答案很复杂。

我正在考虑继承Path或Canvas以用作我的控件。

不要。 Favor composition over inheritance。拥有一个实现控件功能接口的控件类,并且无论使用何种UI技术都可以工作。为控件类提供对控件的UI表示的外观类的引用。外观将指定如何呈现给定状态下的控件(从相关控制对象获取控件状态)。此外,皮肤将响应用户操作,例如鼠标按下并指示控件根据鼠标按键改变其状态 - 因此皮肤知道它与哪个控件相关联,反之亦然。在控件类中有可绑定属性来表示控件状态。

一个简单的例子就是这个tic-tac-toe游戏实现的Square and SquareSkin

例如,想象复选框控件。控件的可绑定属性可能是一个状态为(checked,unchecked,undetermined)的枚举。皮肤可能会将复选框显示为带勾号的方框,以表示已检查的状态。或者,也许皮肤会渲染带有X的圆边。皮肤可以使用任何想要呈现复选框的技术,例如,一个画布或一组节点。皮肤为鼠标点击,按键等注册监听器,并通知复选框控件设置其检查状态。它还有一个关于检查状态的监听器,并将根据该状态选择是否呈现检查记号。

关键是复选框的API接口只是一个带有检查状态的复选框控件类。用户界面的处理方式从复选框API抽象出来,因此您可以在不更改任何其他代码的情况下交换UI实现的内容和外观。

子类化路径与子类化Canvas完全不同。对于订阅的情况,我绝对赞成将Shape节点(或区域)与Canvas相对应。使用节点,你会自动获得一个非常丰富的UI渲染和事件模型,可以绑定的属性集和和绘画框架,这些都不会用Canvas获得。如果您不使用节点,您最终可能会尝试以某种次标准方式重新创建和构建Node功能的某些部分。 Canvas非常适用于从其他框架移植2D游戏或图形引擎或构建像粒子系统等像素操纵器的东西,但以其他方式避免它。

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

任何将类似于窗格的区域划分的子类都可以通过CSS设置为任意形状和颜色。这实际上是JavaFX中的内置复选框(和其他控件)的工作原理。复选框是两个区域的堆叠,一个是盒子,另一个是支票。两者都采用CSS样式 - 为JavaFX搜索.check-box in the modena.css样式表。请注意,如何使用-fx-shape通过指定svg路径(您可以在svg编辑器(如inkscape)中创建)来获取刻度线形状。还要注意背景分层是如何用来获得像聚焦环这样的东西的。使用CSS风格的优点是,您可以在不触及Java代码的情况下在风格上更改控件。

所以使用SkinBase和BehaviourBase是不是一种选择

即使你已经决定不使用这些基类(我认为这是一个不错的决定,即使你是只针对Java的8+) ,我认为值得研究JavaFX source中的控件设计。研究按钮或复选框,这样你就可以看到专家如何做这些事情。另外请注意,这样的实现可能对您的应用程序过度,因为您没有构建可重用的控制库。你只需要一些能在你的应用程序范围内工作的很好的东西(这就是我不一定建议为所有应用程序扩展SkinBase的原因)。

作为最小read up on Controls on the open-jfx wiki

这是需要使用JDK 7

IMO,没有开发新的JavaFX应用程序为目标Java 7中有许多错误修正为Java 8,再加上新的和有用的多点功能添加。通常,Java 7是JavaFX应用程序的次优目标平台。如果您将应用程序打包为self-contained application,那么您可以将任何Java平台随应用程序一起发布,因此目标平台无关紧要。

诸如WebStart或浏览器嵌入式应用程序(小程序)等IMO部署技术可以在系统上使用预先安装的Java运行时,这是传统的部署模式,这对于大多数应用程序来说是最好的避免。

不过,可能会出现这样的情况:由于受控制之外的某些限制,您绝对必须拥有Java 7,所以我想只是对您的情况进行仔细评估。如果你有这样的约束,并且必须建立在一个稳定的,传统的UI工具包上,这个工具包可以和多年前发布的运行时间一起工作,你总是可以使用Swing。

+0

thx为详细答案。非常好的建议。但由于我不能使用jdk 8(大学不允许),所以我决定使用swing。但无论如何它是一个很好的答案;) – Tobi 2014-11-07 20:56:10

+0

这个Control + Skin事件对于MVC/MVP/MV *来说只是一个奇怪的名字。 – cubuspl42 2016-09-09 14:44:14

0

从oracle中,Path类表示一个简单的形状,并提供基本构造和管理几何路径所需的工具,而Canvas是可以使用由GraphicsContext提供的一组图形命令绘制的图像。

这意味着用户可以使用画布根据用户需要绘制所需的形状。

上的基本方法,我可以说是如下:

  1. 使用的帆布因为它会帮助和支持自定义的用户“绘图”。像在MS Paint中一样为圆形,矩形,箭头等创建菜单按钮。画布上的Onclick拖动功能可用于“绘图”。

  2. Circle和Rectangle是您可以使用

  3. 您可以使用箭头等所使用here的方式库可用。 我认为它与你想创建的相同的例子。

  4. 自定义控制器和上下文菜单可以创建过docs.oracle.com

  5. 缩放和移动可以通过拖放功能结合到一个规模 或翻译动画来完成。和的mousePressed可以的mouseReleased可用于跟踪COORDS绘制形状。

0

这是我的建议,你可以使用控制原型。或者一个应用程序或设计工具,它可以为你提供有针对性的控制或图标,具有圆形,矩形和箭头。我不知道我的建议如何工作。你可以尝试一下。