这个答案只是要咨询,有没有真正的正确或错误的答案在这里。如果你不同意这个建议,或者这个建议不适用于你的情况,你可以忽略它。
对不起,但问题是开放式的,可能的答案很复杂。
我正在考虑继承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。
thx为详细答案。非常好的建议。但由于我不能使用jdk 8(大学不允许),所以我决定使用swing。但无论如何它是一个很好的答案;) – Tobi 2014-11-07 20:56:10
这个Control + Skin事件对于MVC/MVP/MV *来说只是一个奇怪的名字。 – cubuspl42 2016-09-09 14:44:14