什麼問題是
默認的JavaFX 8(modena.css)沒有考慮到透明窗口功能在某些平臺上(特別是某些Linux平臺)可選。
在Java 9發佈之前,默認的css不太可能會被更改。
如何解決它
這僅是一個Java的解決方案8+。
提供您自己的CSS來覆蓋默認的CSS,以便您可以支持這些平臺,而不會在某些控件周圍顯示醜陋的白色邊框區域。您提供的CSS可以假設透明窗口不是底層平臺的一項功能,並且可以設置UI的樣式,以便它在這樣的平臺上仍然看起來不錯。由於transparent window feature是一個條件特徵,在應用程序啓動時,check to see if the conditional feature is supported,如果不是,則通過Application.setUserAgentStyleSheet()應用您的自定義樣式表。
示例應用程序
我只測試了這個在Mac(支持透明窗功能),所以我真的不能覈實Linux作爲預期它會工作,但我希望它會工作細:-)
import javafx.application.Application;
import javafx.application.ConditionalFeature;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ColorPicker;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class SolidPick extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) throws Exception {
ColorPicker picker = new ColorPicker();
if (Platform.isSupported(ConditionalFeature.TRANSPARENT_WINDOW)) {
Application.setUserAgentStylesheet(
this.getClass().getResource(
"solid-pick.css"
).toExternalForm()
);
}
StackPane layout = new StackPane(picker);
layout.setPadding(new Insets(10));
stage.setScene(new Scene(layout));
stage.show();
}
}
然後該文件solid-pick.css
整個modena.css與追加到末尾以下附加行的精確副本:
.color-palette {
-fx-background-radius: 0, 0;
-fx-effect: null;
}
個
這些行:
- 給拾色器彈出一個方形的背景,而不是圓形的一個。
- 消除通常圍繞彈出框的半透明陰影效果。
這些東西的組合提供了彈出窗口的形狀和邊框,在沒有提供透明窗口的環境中看起來好多了。
solid-pick.css
文件應該放在與SolidPick應用程序相同的目錄中,以便它被捆綁到應用程序jar中,並可供應用程序類加載器使用。
樣本輸出
這裏是呈現在我的Mac有和沒有在彈出的陰影效果邊框的一些示例輸出。
標準渲染=>

修改渲染,有方形邊框和沒有影子=>

建議的方法
通過你的整個應用程序轉到(可能整個modena.css樣式表),並使用類似於上述顏色選擇器的方法,修復在透明窗口不可用的環境中出現的任何渲染問題。然後在應用程序中使用生成的樣式表(如果許可證允許),通過將自定義樣式表提交給第三方項目(如ControlsFX)將其提交給社區。