2014-02-21 113 views
13

由於我使用的是JavaFX 8,因此我的所有textarea都不適用已在相應css中定義的transparency。它在Java 7中運行良好,但對於JavaFX 8的候選版本,我無法像以前那樣運行它。JavaFX中的textarea的透明背景8

編輯: 這個問題是關於JavaFX TextArea,而不是JTextArea。
-fx-background-color: rgba(53,89,119,0.2);對textarea沒有任何影響,雖然它應該有一個0.2的alpha值,但它是相似的...

這是一個已知的問題嗎?

+0

有沒有人有我一個提示嗎? – WarWolfen

回答

23

TextArea由幾個節點組成。爲了使背景透明,有必要改變子窗格的背景(TextArea,ScrollPane,ViewPort,Content)。這可以通過CSS完成。

CSS實施例:

.text-area { 
    -fx-background-color: rgba(53,89,119,0.4); 
} 

.text-area .scroll-pane { 
    -fx-background-color: transparent; 
} 

.text-area .scroll-pane .viewport{ 
    -fx-background-color: transparent; 
} 


.text-area .scroll-pane .content{ 
    -fx-background-color: transparent; 
} 

同樣可以通過代碼來實現。該代碼不應該用於生產。這只是爲了演示節點結構。

代碼示例(使所有的背景完全透明):

TextArea textArea = new TextArea("I have an ugly white background :-("); 
    // we don't use lambdas to create the change listener since we use 
    // the instance twice via 'this' (see *) 
    textArea.skinProperty().addListener(new ChangeListener<Skin<?>>() { 

     @Override 
     public void changed(
      ObservableValue<? extends Skin<?>> ov, Skin<?> t, Skin<?> t1) { 
      if (t1 != null && t1.getNode() instanceof Region) { 
       Region r = (Region) t1.getNode(); 
       r.setBackground(Background.EMPTY); 

       r.getChildrenUnmodifiable().stream(). 
         filter(n -> n instanceof Region). 
         map(n -> (Region) n). 
         forEach(n -> n.setBackground(Background.EMPTY)); 

       r.getChildrenUnmodifiable().stream(). 
         filter(n -> n instanceof Control). 
         map(n -> (Control) n). 
         forEach(c -> c.skinProperty().addListener(this)); // * 
      } 
     } 
    }); 

更多參考:JavaFX CSS Documentation

+0

這是一個非常聰明的例子。 – jewelsea

+0

謝謝,這是做到了。雖然我可以確認它在JDK 1.7中沒有這個工作! – WarWolfen

+0

只有在未選擇TextArea的情況下,如何才能做到這一點? – kerner1000