Javafx8 pop-up da questão da Transparência
-
21-12-2019 - |
Pergunta
Eu estou tentando porta de minha javafx2 aplicativo para javafx8 mas ter notado alguns problemas no Linux com sobreposição de controles.
A captura de tela mostra como o pop-up tem uma caixa branca em torno dela, que normalmente deve ser transparente e soltar efeito de sombra.Isso só acontece no meu Slackware14 Linux, eu tenho teste na VM do Windows que é executado na mesma máquina e faz bem.
Eu acho que o problema está relacionado a estas questões https://javafx-jira.kenai.com/browse/RT-33709 https://javafx-jira.kenai.com/browse/RT-33750
A minha pergunta é: há alguma solução até que isso seja corrigido ?
Solução
Qual É o Problema
O padrão JavaFX 8 (modena.css) não leva em conta que a janela transparente recurso é opcional em algumas plataformas (especificamente algumas plataformas Linux).
É improvável que o css padrão será alterado até que o Java 9 vem de fora.
Como Corrigir
Esta é uma solução para o Java 8+ só.
Fonte de seu próprio css para substituir o padrão do css, de modo que você pode oferecer suporte a essas plataformas sem apresentar uma branca feia áreas de fronteira em torno de alguns de seus controles.O css que você fornece pode-se assumir que transparente do windows não são um recurso da plataforma subjacente e o estilo da INTERFACE do usuário de forma que ele ainda fica bem em tais plataformas.Como o janela transparente recurso é um ConditionalFeature, no arranque da aplicação, verifique se o condicional funcionalidade é suportada, e se não é, aplicar o seu personalizado de folha de estilos através de Aplicação.setUserAgentStyleSheet().
Aplicação De Exemplo
Eu só testei isso em um Mac (que suporta a janela transparente recurso), então eu realmente não posso verificar que vai funcionar como esperado no Linux, mas eu espero que ele vai funcionar bem :-)
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();
}
}
Em seguida, o arquivo solid-pick.css
uma cópia exata de todo o modena.css com as seguintes linhas adicionais acrescentados ao final:
.color-palette {
-fx-background-radius: 0, 0;
-fx-effect: null;
}
Estas linhas:
- Dar o seletor de cores pop-up de um quadrado de plano de fundo, ao invés de incluir um arredondada.
- Remover o translúcido queda efeito de sombra que normalmente envolve o pop-up.
A combinação de todas essas coisas fornecer o pop-up com uma forma e de fronteira, o que parece muito melhor em um ambiente que não oferece janelas transparentes.
O solid-pick.css
arquivo deve ser colocado no mesmo diretório como o SolidPick aplicação, de modo a que seja incluído no aplicativo jar e estará disponível para o aplicativo carregador de classe.
Exemplo De Saída
Eis alguns exemplos de saída de renderização no meu Mac com e sem o dropshadow fronteira no pop-up.
Padrão de renderização =>
Modificado de renderização, com bordas quadradas e sem sombra =>
Abordagem Sugerida
Por toda a aplicação (e, possivelmente, todo o modena.folha de estilos css) e, usando uma abordagem semelhante à que feito acima para o seletor de cor, correção de qualquer processamento de problemas que surgem em uma janela transparente incapaz ambiente.Em seguida, use a resultante de folha de estilos em seu aplicativo e (no caso de licenciamento de licenças), contribuir com o seu personalizado de folha de estilos para a comunidade, enviando-a para uma festa de 3 projecto, tais como ControlsFX.