gpt4 book ai didi

java - 我可以将 2D 变换应用于 JavaFX 8 Canvas 上的形状吗?

转载 作者:行者123 更新时间:2023-12-01 11:25:57 24 4
gpt4 key购买 nike

我正在将之前在 Swing 中完成的类移植到 JavaFX 8。它显示一个 UI 元素,看起来像一个模拟电压表,有一个半圆,周围有一组定期的“刻度线”。在 Swing 版本中,该类是 JPanel 的扩展,并且在 PaintComponent(Graphics 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 个堆叠的 Canvas 对象。其中一个将绘制静态元素,如半圆和刻度线,另一个用于绘制规则移动的米线。在第一个 Canvas 上,我希望使用与 Swing 版本中类似的循环,轻松地在半圆周围的 ticCount # 个附加位置中重新绘制第一个 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());
}
}

尝试像这样变换 Shape 对象可能仅在绘制到场景而不是 Canvas 上时有效。或者我必须在“ticLine.getTransforms().add(ticTrans)”行之后执行一些操作才能将它们应用于该行。我至少很接近吗?或者有更好的方法来完成我在这里尝试的事情吗?

最佳答案

你做错了什么

在示例代码中,您将转换应用于 Line 对象(您从不显示该对象)。

如何解决

您需要set the transform on the canvas GraphicsContext在你在 Canvas 上划线之前。

示例代码

有关示例,请参阅:

<小时/>
/**
* 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());
}

关于java - 我可以将 2D 变换应用于 JavaFX 8 Canvas 上的形状吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30807053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com