2014-01-09 4 views
3

Я пытаюсь перенести приложение javafx2 на javafx8, но заметил некоторые проблемы с Linux со всплывающими элементами управления.Javafx8 Popup Transparency issue

screenshot На скриншоте показано, как всплывающее окно имеет вокруг него белую коробку, которая обычно должна быть прозрачной и иметь эффект тени. Это происходит только на моем Linux Slackware14, у меня есть тест на виртуальной машине Windows, которая работает на одной машине, и она отлично выглядит.

Я думаю, что проблема связана с этими вопросами https://javafx-jira.kenai.com/browse/RT-33709 https://javafx-jira.kenai.com/browse/RT-33750

Моим вопрос не будет ли какой-либо обходной путь, пока она будет фиксироваться?

ответ

4

, в чем проблема

по умолчанию JavaFX 8 (modena.css) не принимает во внимание, что прозрачная функция окна не является обязательным на некоторых платформах (в частности, некоторые платформы Linux).

Маловероятно, что по умолчанию css будет изменен до появления Java 9.

Как исправить это

Это решение для Java 8+ только.

Поставьте свой собственный css, чтобы переопределить значение css по умолчанию, чтобы вы могли поддерживать эти платформы, не отображая уродливые белые граничные области вокруг некоторых ваших элементов управления. Css, который вы предоставляете, может предполагать, что прозрачные окна не являются признаком базовой платформы и не создают стиль интерфейса, чтобы он по-прежнему выглядел хорошо на таких платформах. Поскольку transparent window feature является ConditionalFeature, при запуске приложения 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; 
} 

Эти строки:

  1. Дают Пипетка Popup квадратный фон, а не округляемой.
  2. Снимите эффект полупрозрачной тени, который обычно окружает всплывающее окно.

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

Файл solid-pick.css должен быть размещен в том же каталоге, что и приложение SolidPick, так что оно будет включено в приложение jar и будет доступно загрузчику классов приложений.

Пример вывода

Ниже приведен пример вывода для визуализации на моем Mac с и без Dropshadow границы на всплывающем окне. не

Стандартный рендеринг =>

standard rendering

Модифицированный рендеринга, с квадратными рамками и ни тени =>

rendering without shadow

Предлагаемый подход

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