2015-03-30 2 views
2

Мне было трудно понять, почему моя прозрачная сцена отказывается быть прозрачной. Наконец-то я узнал, что это было вызвано Tooltip, который был установлен в ImageView:Всплывающая подсказка JavaFX 8 удаляет прозрачность сцены

ImageView imageViewIcon = new ImageView(); 
imageViewIcon.setFitWidth(70); 
imageViewIcon.setFitHeight(70); 
imageViewIcon.setPreserveRatio(false); 
imageViewIcon.setImage(new Image("./next.png")); 

Tooltip tooltip = new Tooltip("Tooltip!"); 
if (this.config.getShowTooltip("true")) { 
    Tooltip.install(imageViewIcon, tooltip); 
} 

Когда я закомментируйте последние 4 линии, прозрачность работы, как и ожидалось, но с Tooltip установлены этапы фон серого цвета (например, фона по умолчанию). Хотя очевидно, что делает кнопка, и всплывающая подсказка не важна для моего макета, было бы неплохо иметь, чтобы дать небольшой намек ...

Любые предложения или обходные пути?

ответ

3

Решение

Установите стиль -fx-background-color: transparent на корневой узел сцены.

фон

Аналогичное поведение обсуждается в Oracle JavaFX Forum post on the JavaFX Scene/Fill Color.

Соответствующие комментарии резьбе Дэвид Грив, ведущий разработчик для функций JavaFX CSS:

Это происходит потому, что modena.css задает цвет фона корневого узла. Решение стиля -fx-background-color: transparent на корневом узле сцены является решением.

BorderPane root = new BorderPane(); 
root.setStyle("-fx-background-color: transparent;"); 

Scene scene = new Scene(root, 600, 400, Color.BLACK); 

по умолчанию пользовательский агент стилей загружается в первый раз, когда управление инстанциируется. Причина этого заключается в том, чтобы избежать загрузки таблиц стилей и уменьшения накладных расходов CSS в сценариях, содержащих узлы, которые не используют CSS.


История позади этого является то, что дизайнер темы Модены чувствовал, что контроль выглядел лучше на этом определенном цвете фона, который является очень светло-серым. К сожалению, фоновое заполнение сцены не может быть написано в стиле CSS, поэтому стиль был установлен в корневом узле сцены. Существует проблема, зарегистрированная в JIRA, чтобы сделать сцену так, чтобы ее можно было нарисовать с помощью CSS (RT-31282)

Достоинством загрузки таким образом является то, чтобы избежать накладных расходов css в сценах, которые не используют элементы управления. Например, это типично для заставки. Или, может быть, игра. Этот дизайн был сделан давно, когда производительность CSS была большой проблемой, но она по-прежнему имеет смысл для встроенных устройств.


В случае Вашего вопроса, Tooltip является контролем, поэтому, когда вы добавляете его на сцену он неявно вызывает параметр по умолчанию modena.css таблицы стилей, который будет загружен для сцены (которая устанавливает фон корня узел сцены до серого, а не пустой или прозрачный заливок, который используется, когда в сцене нет элементов управления).Чтобы сохранить прозрачный фон для приложения, когда элемент управления используется в сцене, необходимо явно указать фон корневого узла сцены прозрачным.


Sample code for a transparent stage:

//this is where the transparency is achieved: 
//the three layers must be made transparent 
//(i) make the VBox transparent (the 4th parameter is the alpha) 
root.setStyle("-fx-background-color: rgba(0, 0, 0, 0);"); 
//(ii) set the scene fill to transparent 
scene.setFill(null); 
//(iii) set the stage background to transparent 
stage.initStyle(TRANSPARENT); 
+0

Спасибо :) Это именно то, что мне было нужно. – RegisteredUser

Смежные вопросы