Javafx禁用Node继承DropShadow的颜色

Javafx disabled Node inherits DropShadow's color

我创建了一个错误效果,如果用户输入不正确的数据值,我会在 TextFields 上设置它并为其设置动画。

public class ErrorEffect extends DropShadow {

    private Timeline animation = new Timeline();

    public ErrorEffect() {
        setOffsetX(0);
        setOffsetY(0);
        setRadius(0);
        setColor(Color.RED);

        animation.getKeyFrames().addAll(
                new KeyFrame(Duration.ZERO, new KeyValue(radiusProperty(), 0)),
                new KeyFrame(new Duration(150), new KeyValue(radiusProperty(), 20)),
                new KeyFrame(new Duration(500), new KeyValue(radiusProperty(), 0)));
    }

    public Timeline getAnimation() {
        return animation;
    }
}

我的问题是每当禁用 TextField 时,它都会显示 DropShadow 的颜色。通常红色是看不到的,因为它的半径设置为 0,并且半径仅在动画期间发生变化。

如果我使用像 InnerShadow 这样的不同效果,则不会发生这种情况,禁用的 TextFields 具有默认颜色并且不继承 InnerShadows 颜色。

我想使用 DropShadow 来完成这项工作,但我不明白为什么会发生这种情况,但使用 InnerShaddow 就不会发生。

我已经尝试过 DVarga 的解决方案,但我得到了奇怪的结果。

我意识到这不是颜色问题,而是不透明度问题。

Googlin for similar opacity issues 我遇到了这个答案,这是一个完全不同的问题,但我仍然尝试了解决方案并且它有效:

似乎这是一个错误,不透明度被应用了两次。它已经被报道过,所以有可能有一天它会被修复。答案还解释了为什么 ScrollPane 中禁用的组件要轻得多,请参见上图。 javafx 中的禁用组件似乎存在很多问题...

因此,我通过在我的 TextFields 上将不透明度设置为 1 解决了我的问题。

textField.setOpacity(1);

编辑:

好的,我以为是初始化的问题,所以在组件初始化后设置不透明度解决了它。

但是我尝试通过 fxml 设置不透明度:

<TextField fx:id="groupTextField" promptText="Group" opacity="1" />

它仍然有效,我什至收到一条警告:

Attribute is redundant because it contains default value

谁能解释一下这是怎么回事?如何在它当前拥有的组件上设置相同的不透明度值可以解决任何问题?