2016-06-29 2 views
2

Программа ниже - пример того, чего я на самом деле пытаюсь достичь. enter image description hereКак сделать контент в среде JavaFX прозрачным?

Я пытаюсь воссоздать изображение выше в JavaFX. Однако у меня возникают трудности, потому что, когда я устанавливаю контент своей сцены на прозрачный, он на самом деле не становится прозрачным, он по-прежнему остается белым.

@Override 
public void start(Stage stage) {   
    try { 
     BorderPane root = new BorderPane(); 

     Scene scene = new Scene(root,400,400); 

     root.setStyle("-fx-background-color: rgba(0,0,0,0);"); 

     scene.setFill(Color.TRANSPARENT); 

     stage.setScene(scene); 
     stage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

Этапы видны из этого кода. Я также установил прозрачность содержимого и изменил стиль по умолчанию в корневой панели на прозрачный.

Я не понимаю, почему это не работает, я устанавливаю контент прозрачным, но фон все еще не прозрачен.

Результат из кода, который я опубликовал, показывает это, поскольку вы можете видеть, что это непрозрачно.

enter image description here

+0

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

+0

Но если сцена прозрачная, вы не видите сцену. Также вы не можете переместить сцену. –

+0

Да. Не уверен, действительно ли то, что вы пытаетесь достичь на своем изображении (настройка фона на прозрачную). Заинтригованный. Заглядывая в нее :) – ManoDestra

ответ

3

Этот вопрос почти дубликат:

Разница в том, что он также просит, чтобы сохранить родные украшения окна, которые не возможно с StageStyle.TRANSPARENT ,

Если вы внимательно посмотрите на образцовые окна, представленные в вопросе, области отделки немного отличаются (например, один включает значок сцены в верхнем левом углу, а другой нет). Я предполагаю, что прозрачное окно, изображенное на этом вопросе, вообще не использует декорации окон ОС, но вместо этого создает собственные декорации, которые очень похожи на декорации окон ОС (это только предположение, хотя).

В любом случае, чтобы добиться аналогичного эффекта с JavaFX, необходимо, чтобы JavaFX использовался для визуализации оконных украшений, а не для оконного менеджера ОС. Чтобы сделать это, обратитесь к следующему вопросу:

В частности, обратите внимание на библиотеке Undecorator:

Вы никогда не будете чтобы получить декорации окон, чтобы точно соответствовать оформлению оконного менеджера ОС, но вы можете создать съели что-то, что выглядит по-другому и обеспечивает аналогичную функциональность. Если вы будете работать над этим, вы сможете достичь чего-то, что близко соответствует оформлению окон ОС, подобно скриншоту окна в вашем вопросе. Хотя, если бы это был я, я бы просто пошел на другой взгляд, который был по-прежнему чистым и понятным для пользователя, похожим на внешний вид, предоставленный Undecorator.

Считаете ли вы, что это можно снять, создав ImageView и используя какой-то прослушиватель сцены, поэтому, когда кадр перемещается, изображение отображает новое изображение того, что стоит за приложением? Или это слишком усложняет это?

Фоновый захват для подхода imageView является разумным альтернативным подходом.

Если вы хотите использовать подход захвата ImageView, вы можете использовать некоторые идеи из следующего ответа:

Обратите внимание, что ImageView типа захвата ответ связан выше вон полностью выполнить то, что вы пожелаете, и вам по-прежнему необходимо выполнить дополнительную работу, чтобы получить именно тот эффект, который вам нужен, когда вы перемещаете сцену или как рабочий стол или окна под вашим окном. Возможно, вам может понадобиться прибегнуть к логике вне JavaFX, чтобы полностью реализовать вашу цель, и обсуждение того, как это сделать, выходит за рамки того, что я буду готов (или могу) обсудить здесь.

Сложно независимо от того, что вы делаете, у меня нет рекомендации между ундекоратором или методом захвата изображения.


Может быть, если вы смешиваете JavaFX и Swing/AWT вы можете быть в состоянии сделать это с помощью JFXPanel и функции AWT PERPIXEL_TRANSPARENT. Я не пробовал эту комбо, но настройки на пиксель для AWT показаны в this oracle sample, как обсуждалось в How to Implement Per-Pixel Translucency.

+0

Извините, мой титул был чем-то заблуждением, я хотел сказать «Сцена не сцена». Я не забочусь о окне, я хочу, чтобы содержимое сцены было прозрачным, как на картинке. –

+1

Да, я понимаю, что (по крайней мере, я думаю, что я делаю ;-), и именно это я и пытался ответить. Вероятно, мой ответ был неясно, но вы не можете сделать это напрямую, вы можете иметь только прозрачные сцены без украшений. Если вы хотите прозрачность и декорации, вам нужно сделать украшения сами. – jewelsea

+0

Считаете ли вы, что это можно снять, создав ImageView и используя какой-то прослушиватель сцены, поэтому, когда кадр перемещается, изображение отображает новое изображение того, что стоит за приложением? Или это слишком усложняет это? –

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