2016-08-31 25 views
0

如果用戶輸入的數據值不正確,我創建了一個錯誤效果,我在TextField上設置了它併爲其設置動畫效果。Javafx已禁用節點繼承DropShadow的顏色

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且半徑只在動畫期間更改,因此通常無法看到紅色。

enter image description here

如果我使用像在內陰影,這不會發生不同的效果,殘疾人的TextField都有默認的顏色和不繼承InnerShadows顏色。

我想用DropShadow進行這項工作,但我無法理解爲什麼會出現這種情況,但InnerShaddow不會發生這種情況。

+1

我只是評論而不是回答,因爲我不知道原因(可能是一個錯誤?),但將下列內容添加到您的'ErrorEffect'構造函數可修復問題:'radiusProperty()。addListener((obs,oldVal ,newVal) - > setColor(newVal.doubleValue()== 0d?Color.TRANSPARENT:Color.RED));'。它的功能只是在半徑達到零時將效果顏色設置爲透明,否則顏色保持爲紅色。你也可以用'KeyFrame'來做同樣的事情,但我發現這個擴展很簡單。 – DVarga

回答

0

我試過DVarga的解決方案,但我得到了奇怪的結果。

enter image description here

我意識到這是不是一種顏色的問題,而是一個不透明的。

Googlin類似的透明度問題,我碰到這個答案,它是一個完全不同的問題,但我仍然試圖解決方案,它的工作: https://stackoverflow.com/a/35712919/2821023

看起來這是一個錯誤,不透明度被塗抹兩次。據報道,有一天它有可能得到修復。此外,答案解釋了爲什麼ScrollPane中禁用的組件要輕得多,請參閱上面的圖片。在javafx中,禁用組件似乎有很多問題...

所以,我通過在我的TextFields上將不透明度設置爲1來解決了我的問題。

textField.setOpacity(1); 

編輯:

好吧,我認爲這是一些與初始化,所以不透明度設置後解決它成分進行初始化。

不過,我試圖通過設置FXML不透明度:

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

,它仍然有效,我甚至得到一個警告說:

Attribute is redundant because it contains default value 

誰能解釋這是怎麼回事?如何在它當前擁有的組件上設置相同的不透明度值可以解決任何問題?