В чем проблема
JavaFX 8 по умолчанию (modena.css) не учитывает, что функция прозрачного окна является необязательной на некоторых платформах (в частности, на некоторых платформах Linux).
Маловероятно, что CSS по умолчанию будет изменен, пока не выйдет Java 9.
Как это исправить
Это решение только для Java 8+.
Предоставьте свой собственный css, чтобы переопределить css по умолчанию, чтобы вы могли поддерживать эти платформы, не отображая уродливые белые области вокруг некоторых ваших элементов управления. Предоставляемый вами css может предполагать, что прозрачные окна не являются функцией базовой платформы, и стилизовать пользовательский интерфейс так, чтобы он по-прежнему хорошо выглядел на таких платформах. Поскольку функция прозрачного окна является условной функцией, при запуске приложения проверьте чтобы узнать, поддерживается ли условная функция, а если нет, примените собственную таблицу стилей через 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.
09.01.2014