当前位置: 首页 > 知识库问答 >
问题:

我可以将2D变换应用于JavaFX8画布上的形状吗?

况浩邈
2023-03-14

我正在将以前在Swing中完成的一个类移植到JavaFX8。它显示一个UI元素,看起来像一个模拟电压表,有一个半圆,周围有一组固定间隔的“tic标记”。在Swing版本中,该类是JPanel的扩展,tic标记在paintComponent(图g)中绘制,如下所示:

private Line2D ticLine = new Line2D.Float(0, LINE_ROOT_Y, TIC_LENGTH, LINE_ROOT_Y);

public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;

      // Draw tic marks
      if (ticCount > 0)
      {
         g2.draw(ticLine); // First tic

         AffineTransform ticTrans = new AffineTransform();
         // Draw all additional tics rotated around half circle
         for (int i = 1; i < ticCount; i++)
         {
            ticTrans.rotate(Math.toRadians(ticGap),
                 METER_MIDDLE, METER_BASE_Y);
            g2.draw(ticTrans.createTransformedShape(ticLine));
         }
      }
   }

这很有效。

现在使用JavaFX,我使用了一个扩展VBox的类。它包含2个堆叠的画布对象。其中一个将绘制静态元素,如半圆和tic标记,另一个用于规则移动的仪表线。在第一张画布上,我希望使用与Swing版本类似的循环,在半圆周围的额外位置的ticCount中轻松重画第一个tic标记。因此,我尝试了以下编译并运行的方法,但只绘制了第一个tic标记:

// Called from the constructor:
MeterGC = MeterCanvas.getGraphicsContext2D();
Line ticLine = new Line(0, LINE_ROOT_Y, TIC_LENGTH, LINE_ROOT_Y);

// Draw tic marks
if (ticCount > 1)
{
   MeterGC.setStroke(Color.GRAY);
   MeterGC.setLineWidth(BASIC_LINE_WIDTH);
   MeterGC.strokeLine(ticLine.getStartX(), ticLine.getStartY(), 
                      ticLine.getEndX(), ticLine.getEndY());

   Rotate ticTrans = new Rotate(Math.toRadians(ticGap), METER_MIDDLE, METER_BASE_Y);
   for (int i = 1; i < ticCount; i++)
   {
      ticLine.getTransforms().add(ticTrans);
      MeterGC.strokeLine(ticLine.getStartX(), ticLine.getStartY(), 
                         ticLine.getEndX(), ticLine.getEndY());
    }
}

这可能是试图转换像这样的形状对象只在绘制到一个场景时工作,而不是在画布上。或者我必须在“ticLine.get转换()”行之后做一些事情。添加(ticTrans)行以使它们应用到该行。我至少接近了吗?还是有更好的方法来做我正在尝试的事情?

共有2个答案

白昊乾
2023-03-14

这是我修改后的for循环,它工作得很好。注意到在JavaFX中不再需要将Rotate中的角度转换为弧度,这也是让它工作的关键。

for (int i = 1; i < ticCount; i++)
{
   Rotate ticTrans = new Rotate(ticGap * i, METER_MIDDLE, METER_BASE_Y);
   MeterGC.setTransform(ticTrans.getMxx(), ticTrans.getMyx(), ticTrans.getMxy(),
                        ticTrans.getMyy(), ticTrans.getTx(), ticTrans.getTy());
   MeterGC.strokeLine(ticLine.getStartX(), ticLine.getStartY(), 
                      ticLine.getEndX(), ticLine.getEndY());
}
景信瑞
2023-03-14

你做错了什么

在示例代码中,将变换应用于对象(从未显示)。

如何修复它

在画布上划行之前,需要在画布上设置变换GraphicsContext

样本代码

有关示例,请参阅:

  • 如何绘制在JavaFX画布上旋转的图像?
/**
 * Sets the transform for the GraphicsContext to rotate around a pivot point.
 *
 * @param gc the graphics context the transform to applied to.
 * @param angle the angle of rotation.
 * @param px the x pivot co-ordinate for the rotation (in canvas co-ordinates).
 * @param py the y pivot co-ordinate for the rotation (in canvas co-ordinates).
 */
private void rotate(GraphicsContext gc, double angle, double px, double py) {
    Rotate r = new Rotate(angle, px, py);
    gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy());
}
 类似资料:
  • 问题内容: 我想将我的线性布局制作成环形。 我遵循了此链接,但没有环形布局,而是环形布局。 https://developer.android.com/guide/topics/resources/drawable- resource.html#Shape 我的xml 和ring.xml在drawable中 我只是在布局中出现一个圆圈而不是ring。抱歉,由于声誉欠佳,我无法上传输出图片。 问题答

  • 在上一章中,我们已经看到了JavaFX的基本应用,我们学习了如何创建一个空窗口以及如何在JavaFX的XY平面上绘制一条线。 除了线,我们还可以绘制其他几个2D形状。 2D形状 通常,2D形状是可以在XY平面上绘制的几何图形,包括直线,矩形,圆形等。 使用JavaFX库,您可以绘制 - 预定义的形状,如直线,矩形,圆,椭圆,多边形,折线,立方曲线,四边形曲线,圆弧。 路径元素,如MoveTO路径元

  • 主要内容:JOGL 正方形示例,JOGL 三角形示例在上一节中,我们已经学习了如何在 JOGL 中绘制基本线条。使用相同的方法,我们还可以绘制各种类型的形状,例如正方形、矩形、三角形等。 JOGL 正方形示例 在这个例子中,我们将绘制四个不同的边,使它们都连接在一个正方形的点上。 输出结果如下: JOGL 三角形示例 在这个例子中,我们将绘制三个不同的边,它们都连接在一个三角形形状的点上。 输出结果如下: 因此,任何类型的图形都可以通过连接特定形状

  • Canvas中,默认的坐标系统是以画布的左上角为坐标原点(0, 0),水平向右为X轴,垂直向下为Y轴,以像素为单位。Canvas在坐标系统上的每个点,都与图形上的一个像素点相对应。如图 4‑30 所示: 图4-30 Canvas的默认坐标系 如果改变Canvas坐标系统的原点,图形也会随之发生改变。针对这一特点,可以通过变换坐标系统来间接操作图形,实现对图形的移动、缩放、旋转。 Canvas的AP

  • 我目前正在开发一个绘画程序(类似于Gimp和Photoshop),为了做到这一点,我需要图层。我创建了一个名为JImage的类,它有一个

  • 问题内容: 我有这个控制器方法: 但是,当我向该端点发送发布请求时,得到以下信息 当我从注释中删除params参数时,我得到了一个更一般的错误,它将说它找不到第一个必需的参数(开始),而实际上它与参数end,hours和username一起发送。 如何在Spring MVC中获取方法中的参数? 我在这篇文章中读到了只能用于get方法的内容,但是如果我删除并坚持使用批注的params参数,它仍然无法