Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface JavaFX-如何创建简单的自定义绘图控件?_User Interface_Javafx - Fatal编程技术网

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

User interface JavaFX-如何创建简单的自定义绘图控件?,user-interface,javafx,User Interface,Javafx,我的任务是作为一个大学项目编写一个图形网络编辑器应用程序。为此,我需要三种类型的项目/控件。圆形、矩形和箭头连接其他形状(整个设计在某些方面有点像MS Visio)。形状/控件需要一些附加功能,如移动、缩放上下文菜单等。我还需要完全控制这些对象的图形表示,即我希望自己“绘制”它们,或者至少能够根据需要修改它们 我正在使用JavaFX,对它几乎没有经验。所以我想知道,实现这些自定义控件的最佳方式是什么。需要使用JDK 7,因此使用SkinBase和behaviousbase不是一个选项,因为它们在

我的任务是作为一个大学项目编写一个图形网络编辑器应用程序。为此,我需要三种类型的项目/控件。圆形、矩形和箭头连接其他形状(整个设计在某些方面有点像MS Visio)。形状/控件需要一些附加功能,如移动、缩放上下文菜单等。我还需要完全控制这些对象的图形表示,即我希望自己“绘制”它们,或者至少能够根据需要修改它们

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

我正在考虑将
Path
Canvas
子类化以用作我的控件。但我对其影响知之甚少,无法做出明智的决定

有人能给我一些建议吗?
Thx alot.

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

这意味着用户可以使用画布来绘制用户需要的形状

我可以说的基本方式如下:

  • 使用画布,因为它将有助于并允许自定义用户“绘图”。为圆、矩形、箭头等创建菜单按钮,如MS Paint。画布上的Onclick拖动功能可用于“绘图”

  • 圆和矩形在您可以使用的库中可用

  • 你可以像以前那样使用箭头。 我认为这和你想要创建的例子是一样的

  • 也可以创建自定义控制器和上下文菜单

  • 缩放和移动可以通过将拖动功能绑定到缩放来完成 或者翻译动画。Mousepressed和MouseRelease可用于跟踪坐标以绘制形状


  • 这个答案只是建议,这里没有真正正确或错误的答案。建议必然是自以为是的,不适用于所有情况,如果你不同意它,或者它不适用于你的情况,就忽略它

    抱歉这么长,但问题是开放式的,可能的答案很复杂

    我正在考虑将Path或Canvas子类化以用作我的控件

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

    这方面的一个简单示例是tic-tac-toe游戏实现中的

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

    关键是checkbox的API接口只是一个具有check状态的checkbox控件类。UI的处理方式是从checkbox API中抽象出来的,因此您可以随意地交换UI实现,而无需更改任何其他代码

    子类化路径与子类化画布完全不同。在这种情况下,我绝对倾向于将形状节点(或区域)子类化,而不是将其子类化为画布。使用节点,您将自动拥有一个真正丰富的UI渲染和事件模型、可绑定的属性集和绘制框架,而这是使用画布无法获得的。如果不使用节点,则可能会尝试以低于标准的方式重新创建和构建节点功能的某些部分。Canvas非常适合移植2D游戏或其他框架中的绘图引擎,或构建像素操纵器(如粒子系统),但在其他方面可以避免

    考虑为控件外观使用布局窗格,例如StackPane或类似的东西。布局窗格是容器,因此您可以在其中放置内容,并使用聚合和合成来构建更复杂的控件。布局窗格也有助于布置节点

    任何子类化区域(如窗格)的内容都可以通过CSS设置为任意形状和颜色。这实际上就是JavaFX中内置复选框(和其他控件)的工作方式。复选框是由两个区域组成的堆栈,一个是框,另一个是复选框。两者都是在CSS-SearchforStylesheet中为JavaFX设置样式的。请注意如何使用
    -fx shape
    通过指定svg路径(可以在svg编辑器(如inkscape)中创建)来获取勾号形状。还要注意如何使用背景分层来获得焦点环之类的东西。使用