我需要做一个十字架与两个不同颜色的部分一样,在下面的图片。
片段可以改变大小,这是一个通过绑定或其他方式考虑的元素。
如何在JavaFX中创建这个图形元素?
我用虚线看,但我不想在每一段之间的空间,但不同的颜色。我必须把两个假想的线?
我用的是JavaFX 17。
谢谢你的帮忙
编辑01/04:
我已经做了一些测试,但破折号不适合正确。
我想把每一笔画在垂直线上间隔50px,在水平线上间隔9.7px,但是当我正确地填充表格时,它们没有给我正确的尺寸。
我是否输入了错误的数据?
代码:
public void initialize(URL url, ResourceBundle resourceBundle)
{
var line = new Line(200, 200, 200, 600);
line.setStroke(Paint.valueOf("#FF0000"));
line.setStrokeWidth(10.0);
var line2 = new Line(200,200,200,600);
line2.setStroke(Paint.valueOf("#00FF13"));
line2.setStrokeWidth(10.0);
line2.getStrokeDashArray().addAll(50.0d, 50.0d);
var line3 = new Line(250, 650, 650, 650);
line3.setStroke(Paint.valueOf("#FF0000"));
line3.setStrokeWidth(10.0);
var line4 = new Line(250, 650, 650, 650);
line4.setStroke(Paint.valueOf("#00FF13"));
line4.setStrokeWidth(10.0);
line4.getStrokeDashArray().addAll(9.7d, 9.7d);
var root = new Group(line, line2, line3, line4);
anchorPane.getChildren().add(root);
}
代码结果:
4条答案
按热度按时间yc0p9oo01#
你可以画两条互相重叠的虚线,一条是红色的,另一条是绿色的。为了用第二条来填充空白,你只需要设置合适的虚线偏移量。
v6ylcynt2#
使用单独线条的解决方案(每种颜色的虚线不叠加)
您可以使用描边的线性渐变对单个线条执行此操作。
例如,若要创建使用50px垂直虚线重复两种颜色的线性渐变,请创建从(0,0)到(0,100)的线性渐变,其中第一种颜色为0和50%,第二种颜色为50%和100%:
或
下面是一个完整的工作示例。自定义窗格将线条布置为十字形,这会对窗格大小的变化做出React。线条的虚线效果与线条大小无关。
更新以解决备注
请注意,这并不限于水平线或垂直线。只要
LinearGradient
的startX
、startY
、endX
和endY
参数选择为与线平行,这将起作用。如果线的斜率可能发生变化,stroke
将需要相应地更新。以下版本创建了对角线,如果窗口大小被调整,这些对角线将具有任意斜率:我不认为这可以用于任意路径,但它将工作的任何直线。
v6ylcynt3#
Group
作为局部坐标创建直线**该方法基于Mipa's answer。
每一对线都是重叠的,但是我们可以用
setStrokeDashOffset
方法做一个偏移来看到下面的线。每一条线都是Group节点的子节点,它被用作局部坐标系。一旦创建了一个新的cross,我们可以把它放在任何我们想要的地方,而不需要改变任何局部坐标。这是一个单独的javafx类,你可以试试。抱歉硬编码f2uvfpb94#
正如@James_D所指出的,LinearGradient是正确的选择。下面是我的方法,它使用Rectangle,放入LinearGradient,然后旋转和重新定位Rectangle来做十字线。
当然是Kotlin。
与@James_D不同的是,LinearGradient宽度是通过使用Rectangle的长度和所需的重复次数来设置的。如果需要更改重复次数,则在Rectangle上放置一个扩展函数来重新计算LinearGradient将是微不足道的。
注意,只有大约3行代码做渐变的东西,其余的是布局。
对于缩放,我很想在整个窗格上进行缩放转换,并将其作为一个单位使用。
不管怎样,它看起来是这样的: