将文本设置为随机颜色和不透明度JavaFX

6

我需要一个JavaFX程序,可以将文本设置为随机颜色和不透明度,但我不确定如何实现。

这是我的代码示例:

Text text1 = new Text();
text1.setText("Java");
text1.setFont(Font.font("Times New Roman", FontWeight.BOLD, FontPosture.ITALIC, 22));
text1.setRotate(90);
gridpane.add(text1, 3, 1);
2个回答

12
你可以使用Math.random()生成一个位于[0,1)范围内的Double,所以你需要执行以下操作:

text.setOpacity(Math.random());

颜色方面需要在文档中深入挖掘,但可以通过以下方式实现:

text.setFill(Color.color(Math.random(), Math.random(), Math.random());

setFill来自于Shape,而Text继承自ShapesetFill接受一个Paint,而Color是最简单的实现。 Color.color(double,double,double)以double值的形式获取rgb值,这些double值在[0,1]范围内。
学会如何在文档中导航,你就能够快速地自己找到这些内容!
注意:透明度/rgb颜色都采用[0,1]范围内的double值,其中Math.random()产生的是[0,1)范围内的值。如果你不熟悉这种表示法,这意味着Math.random()永远不会生成1,而只会生成小于1的数字。因此,使用此方法,你将永远不能得到100%完全不透明/红/绿/蓝的效果,但实际上你可能无法分辨出差异,所以最好使用更简单的方法。

注意2:javafx.scene.paint.Color#color实际上提供了一个包括不透明度的四参数构造函数,但我建议像上面那样设置文本节点本身的不透明度,而不是颜色的不透明度。


由于我通常使用Label而不是Text,这里有一个链接讨论何时使用其中之一:https://dev59.com/h2Af5IYBdhLWcg3wsUbT - CAD97
谢谢你的提示,透明度有用,但颜色仍然给我一个不合适的构造函数错误。我之前尝试过math.random,但不知道需要使用它3次。 - Sunny Dhillon
那是我在阅读文档时的错误。构造函数接受(双精度 r,双精度 g,双精度 b,双精度 alpha)。现在我已经更改了答案,使用了 Color.color,它有一个 rgb 选项。你需要三个随机数,因为该方法需要三个值。 - CAD97
太棒了,谢谢!我回家后会试一试,应该可以用了。 - Sunny Dhillon
仍然无法运行,代码为text.setFill(Color.color(Math.random(), Math.random(), Math.random()); - Sunny Dhillon
请确保您已经导入了 javafx.scene.paint.Color,而不是其他的颜色类,例如 java.awt 中的颜色类,因为只有 JavaFX 的颜色类在这种情况下才能正常工作。对我来说它就像现成的一样工作。 - CAD97

0

像这样:

Text randomColorText(String txt) {
    Text t = new Text(txt);
    Random rng = new Random();
    int c = rng.nextInt();
    int r = c & 255;
    int g = (c >>> 8) & 255;
    int b = (c >>> 16) & 255;
    double op = (c >>> 24) / 255.0;
    t.setFill(Color.rgb(r, g, b, op));
    // or use only r,g,b above and set opacity of the Text shape: t.setOpacity(op);
    return t;
}

请注意,提到Random永远不会返回double == 1.0的其他答案是错误的,因为颜色RGB值与double没有相同的范围-通常它们最终成为范围在0-255之间的8位值,在某些高端应用程序上,您可能会使用每个通道16位。使用来自Random的双倍数,您将获得完整的颜色范围。
您会注意到,我避免了多次调用随机数生成器来表示通常由32位值表示的内容。(微优化:调用nextInt完成nextDouble的一半工作,我们只需要调用一次。我通常会将Random实例保存为静态变量,而不是每次调用该方法时创建一个新的实例。java.util.Random是线程安全的。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接