我正在将以前在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)行以使它们应用到该行。我至少接近了吗?还是有更好的方法来做我正在尝试的事情?
这是我修改后的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());
}
你做错了什么
在示例代码中,将变换应用于行
对象(从未显示)。
如何修复它
在画布上划行之前,需要在画布上设置变换GraphicsContext
。
样本代码
有关示例,请参阅:
/**
* 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参数,它仍然无法