JavaFX - 2D 形状


在前面的章节中,我们已经了解了JavaFX的基本应用,其中我们学习了如何创建一个空窗口以及如何在JavaFX的XY平面上绘制一条线。除了直线之外,我们还可以绘制其他几种2D形状。

2D 形状

一般来说,2D形状是可以在XY平面上绘制的几何图形,包括直线、矩形、圆形等。

使用 JavaFX 库,您可以绘制 -

  • 预定义形状,例如直线、矩形、圆形、椭圆形、多边形、折线、三次曲线、四边形曲线、圆弧。

  • 路径元素,例如 MoveTO 路径元素、直线、水平线、垂直线、三次曲线、二次曲线、圆弧。

  • 除了这些之外,您还可以通过解析 SVG 路径来绘制 2D 形状。

上述每个 2D 形状都由一个类表示,所有这些类都属于javafx.scene.shape包。Shape类是 JavaFX 中所有二维形状的基类。

创建 2D 形状

要创建图表,您需要 -

  • 实例化所需形状的相应类。
  • 设置形状的属性。
  • 将形状对象添加到组中。

实例化相应的类

要创建二维形状,首先需要实例化其各自的类。

例如,如果要创建一条线,则需要实例化名为 Line 的类,如下所示 -

Line line = new Line();

设置形状的属性

实例化该类后,您需要使用 setter 方法设置形状的属性。

例如,要绘制一条线,您需要传递该线的起点和终点的 x 和 y 坐标。您可以使用各自的 setter 方法指定这些值,如下所示 -

//Setting the Properties of the Line 
line.setStartX(150.0f); 
line.setStartY(140.0f);         
line.setEndX(450.0f); 
line.setEndY(140.0f);

将形状对象添加到组中

最后,您需要将形状的对象添加到组中,方法是将其作为构造函数的参数传递,如下所示。

//Creating a Group object  
Group root = new Group(line);

下表列出了 JavaFX 提供的各种形状(类)。

序列号 形状及描述
1 线

线是连接两点的几何结构。javafx.scene.shape包的 Line 类表示XY 平面中的一条线

2 长方形

一般来说,矩形是具有两对平行且重叠的边且所有内角均为直角的四边多边形。在 JavaFX 中,矩形由名为Rectangle的类表示。该类属于包javafx.scene.shape

3 圆角矩形

在JavaFX中,您可以绘制具有锐边或拱形边缘的矩形,具有拱形边缘的矩形称为圆角矩形。

4 圆圈

圆是一条形成闭环的线,其上的每个点到中心点的距离都是固定的。在 JavaFX 中,圆由名为Circle的类表示。该类属于包javafx.scene.shape

5 椭圆

椭圆由两个点定义,每个点称为焦点。如果取椭圆上的任意一点,到焦点的距离之和是恒定的。椭圆的大小由这两个距离之和确定。

在 JavaFX 中,椭圆由名为Ellipse的类表示。该类属于包javafx.scene.shape

6 多边形

由多条首尾相连的共面线段形成的封闭形状。在 JavaFX 中,多边形由名为Polygon的类表示。该类属于包javafx.scene.shape

7 折线

折线与多边形相同,只是折线最终不闭合。或者,由一条或多条线段组成的连续线。在 JavaFX 中,Polyline 由名为Polygon的类表示。该类属于包javafx.scene.shape

8 三次曲线

三次曲线是 XY 平面中的贝塞尔参数曲线,是 3 次曲线。在 JavaFX 中,三次曲线由名为CubicCurve的类表示。该类属于包javafx.scene.shape

9 四曲线

二次曲线是 XY 平面中的贝塞尔参数曲线,是 2 次曲线。在 JavaFX 中,QuadCurve 由名为 QuadCurve 的类表示。该类属于包javafx.scene.shape

10

圆弧是曲线的一部分。在 JavaFX 中,弧由名为Arc的类表示。这个类属于包 - javafx.scene.shape

电弧的类型

除此之外,我们还可以绘制三种类型的弧:Open、Chord、Round

11 SVG路径

在JavaFX中,我们可以通过解析SVG路径来构造图像。此类形状由名为SVGPath的类表示。该类属于包javafx.scene.shape。该类有一个名为“字符串”数据类型的内容的属性。这表示 SVG 路径编码字符串,应从中绘制图像。

通过路径类绘制更多形状

在上一节中,我们了解了如何通过实例化类并设置相应的参数来绘制一些简单的预定义形状。

但是,仅仅这些预定义的形状不足以构建除javafx.shape 包提供的基元之外的更复杂的形状。

例如,如果您想绘制如下图所示的图形元素,则不能依赖那些简单的形状。

路径类

路径类

为了绘制如此复杂的结构,JavaFX 提供了一个名为Path的类。此类表示形状的几何轮廓。

它附加到一个可观察列表,其中包含各种路径元素,例如 moveTo、LineTo、HlineTo、VlineTo、ArcTo、QuadCurveTo、CubicCurveTo。

实例化时,此类根据给定的路径元素构造一条路径。

您可以在实例化该类时将路径元素传递给该类,如下所示 -

Path myshape = new Path(pathElement1, pathElement2, pathElement3);

或者,您可以获取可观察列表并使用addAll()方法添加所有路径元素,如下所示 -

Path myshape = new Path(); 
myshape.getElements().addAll(pathElement1, pathElement2, pathElement3); 

您还可以使用 add() 方法单独添加元素:

Path myshape = new Path(); 
myshape.getElements().add(pathElement1);

移动到路径元素

路径元素MoveTo用于将路径的当前位置移动到指定点。它通常用于设置使用路径元素绘制的形状的起点。

它由javafx.scene.shape包中名为LineTo的类表示。它有 double 数据类型的 2 个属性,即 -

  • X - 从当前位置绘制直线的点的 x 坐标。

  • Y - 从当前位置绘制直线的点的 y 坐标。

您可以通过实例化 MoveTo 类并传递新点的 x、y 坐标来创建移动到路径元素,如下所示 -

MoveTo moveTo = new MoveTo(x, y);

如果不向构造函数传递任何值,则新点将设置为 (0,0)。

您还可以使用各自的 setter 方法将值设置为 x、y 坐标,如下所示 -

setX(value); 
setY(value); 

示例 – 绘制复杂路径

在此示例中,我们将展示如何使用Path、MoveToLine类绘制以下形状。

复杂路径

将此代码保存在名为ComplexShape.java 的文件中。

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.scene.shape.LineTo; 
import javafx.scene.shape.MoveTo; 
import javafx.scene.shape.Path; 
         
public class ComplexShape extends Application { 
   @Override 
   public void start(Stage stage) { 
      //Creating a Path 
      Path path = new Path(); 
       
      //Moving to the starting point 
      MoveTo moveTo = new MoveTo(108, 71); 
        
      //Creating 1st line 
      LineTo line1 = new LineTo(321, 161);  
       
      //Creating 2nd line 
      LineTo line2 = new LineTo(126,232);       
       
      //Creating 3rd line 
      LineTo line3 = new LineTo(232,52);  
       
      //Creating 4th line 
      LineTo line4 = new LineTo(269, 250);   
       
      //Creating 4th line 
      LineTo line5 = new LineTo(108, 71);  
       
      //Adding all the elements to the path 
      path.getElements().add(moveTo); 
      path.getElements().addAll(line1, line2, line3, line4, line5);        
         
      //Creating a Group object  
      Group root = new Group(path); 
         
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 300);  
      
      //Setting title to the Stage 
      stage.setTitle("Drawing an arc through a path");
      
      //Adding scene to the stage 
      stage.setScene(scene);
      
      //Displaying the contents of the stage 
      stage.show();         
   } 
   public static void main(String args[]){ 
      launch(args); 
   } 
}       

使用以下命令从命令提示符编译并执行保存的 java 文件。

javac ComplexShape.java 
java ComplexShape

执行时,上述程序会生成一个显示弧线的 JavaFX 窗口,该弧线从当前位置绘制到指定点,如下所示。

通过路径绘制圆弧

以下是 JavaFX 提供的各种路径元素(类)。这些类存在于包javafx.shape中。所有这些类都继承类PathElement

序列号 形状及描述
1 线路至

路径元素线用于从当前位置绘制一条直线到指定坐标中的一点。它由名为LineTo的类表示。该类属于包javafx.scene.shape

2 线至

路径元素HLineTo用于从当前位置绘制一条到指定坐标中的点的水平线。它由名为HLineTo的类表示。该类属于包javafx.scene.shape

3 线路至

路径元素垂直线用于从当前位置绘制一条到指定坐标中的点的垂直线。它由名为VLineTo的类表示。该类属于包javafx.scene.shape

4 四曲线至

路径元二次曲线用于绘制从当前位置到指定坐标中的一点的二次曲线。它由名为QuadraticCurveTo的类表示。该类属于包javafx.scene.shape

5 三次曲线到

路径元素三次曲线用于绘制从当前位置到指定坐标中的一点的三次曲线。它由名为CubicCurveTo的类表示。该类属于包javafx.scene.shape

6 圆弧图

路径元素Arc用于绘制从当前位置到指定坐标中的一点的圆弧。它由名为ArcTo的类表示。该类属于包javafx.scene.shape

2D 对象的属性

对于所有二维对象,您可以设置各种属性,如填充、描边、StrokeType 等。以下部分讨论 2D 对象的各种属性。

对 2D 对象的操作

如果我们向组中添加多个形状,则第一个形状将与第二个形状重叠,如下所示。

2D 对象上的操作

除了变换(旋转、缩放、平移等)、过渡(动画)之外,您还可以对 2D 对象执行三种操作,即并集、减法交集

序列号 操作及说明
1 联盟运作

此操作将两个或多个形状作为输入并返回它们所占据的面积。

2 交叉口操作

此操作将两个或多个形状作为输入并返回它们之间的相交区域。

3 减法运算

此操作采用两个或多个形状作为输入。然后,它返回第一个形状的面积,不包括与第二个形状重叠的区域。