/ / Se olvida el color de la etiqueta de Java FX: java, javafx, javafx-2, fxml, scenebuilder

Se olvidó el color de la etiqueta de Java FX: java, javafx, javafx-2, fxml, scenebuilder

He observado el siguiente problema en un proyecto JavaFX simple. En NetBeans he creado un proyecto FXML simple. Contiene el archivo FXML.

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="800.0" prefWidth="1280.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sensordemo.MainController">
<children>
<VBox blendMode="COLOR_DODGE" layoutX="14.0" layoutY="12.0" prefHeight="453.0" prefWidth="169.0">
<children>
<VBox prefHeight="147.0" prefWidth="109.0">
<children>
<Label text="XXXXX" textFill="#8c5123">
<font>
<Font name="Arial Bold Italic" size="18.0" />
</font>
</Label>
</children>
</VBox>
<VBox prefHeight="134.0" prefWidth="83.0">
<children>
<Label text="YYYYY" textFill="#23288d">
<font>
<Font name="Arial Bold Italic" size="18.0" />
</font></Label>
</children>
</VBox>
<VBox prefHeight="167.0" prefWidth="83.0">
<children>
<Label text="ZZZZZ" textFill="#23288d">
<font>
<Font name="Arial Bold Italic" size="18.0" />
</font>
</Label>
</children>
</VBox>
</children>
</VBox>

</children>
</AnchorPane>

El color de la etiqueta correctamente es correctamente.se muestra en FX Scene Builder, pero si uso la función de vista previa de Scene Builder es ver el color incorrecto de la etiqueta. Veo fuente blanca en el fondo gris. En caso de que cree la construcción de este proyecto simple veo los mismos colores incorrectos. ¿Cuál es la razón de este problema? Me parece que la definición correcta de colores no está incluida en la compilación. yo suelo

  1. Netbeans 8.1
  2. Java SDK 8 de 64 bits.
  3. Windows 7 de 64 bits

Gracias de antemano

Respuestas

2 para la respuesta № 1

Me temo que, de alguna manera, SceneBuilder tuvo el efecto incorrecto.

Estás usando el BlendMode.COLOR_DODGE.

Desde el javadoc:

Los componentes de color de entrada inferiores se dividen por la inversa de los componentes de color de entrada superiores para producir el color resultante.

Así que dado el componente de color de fondo B y el componente de color de texto T el componente de la salida P se calcula como

P = min(B / (1 - T), 1)

(Componentes en rango [0, 1] aquí)

Ninguno de los componentes de color de los colores que utiliza para el Label el color del texto es mas oscuro que 0.13, asi que B / (1 - T) >= B / 0.87 lo que significa cualquier color de fondo con componentes (0.87, 0.87, 0.87) o más brillante se mostrará en color blanco. Este es el caso del fondo predeterminado en una escena JavaFX. Así que el blanco es el color esperado.

Tal vez deberías usar un diferente blendMode o cambiar el AnchorPane Fondo a algo más oscuro para ver los colores del texto:

<AnchorPane style="-fx-background-color: #888;" ...

Mi conjetura es que no necesitas un blendMode diferente a la predeterminada (SRC_OVER), pero solo hay que ajustar el fondo del AnchorPane:

<AnchorPane style="-fx-background-color: white;" id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="800.0" prefWidth="1280.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1">
<children>
<VBox layoutX="14.0" layoutY="12.0" prefHeight="453.0" prefWidth="169.0">
...
</VBox>
</children>
</AnchorPane>

1 para la respuesta № 2

Algunas formas de obtener el resultado esperado son:

~> 1) Si mantienes ese estilo se recomienda esto

En el SceneViewer, agregue manualmente el color de fondo de cada VBox o etiqueta usando el css en línea:

-fx-background-color:white;

~> 2) Mejores practicas

Agregue un StyleClass en cada VBox o etiqueta a través de SceneViewer y use un archivo css externo para su aplicación:

   .styleClassName {

-fx-background-color:white;

}

~> 3)

Puede agregar una ID única para cada VBox o etiqueta que tenga y modificar su estilo en el código de Java usando:

elementID.setStyle(" -fx-background-color:white; ");

Menciona eso: El color de fondo predeterminado de la mayoría de los diseños de JavaFX es gris, por lo que tiene que cambiarlo.