2012-09-12 26 views
6

Tengo mucha experiencia con WPF y soy nuevo en JavaFX 2.0. Estoy a punto de mover un proyecto de Silverlight a JavaFX 2.0. Dos libros de Apress y varios hilos no pudieron responder mis preguntas (tal vez no puedo ver o entender las respuestas, debido a mis expectativas WPF influenciadas).JavaFX 2.0 - control existente estilo/plantilla

Lo que necesito es un control con funcionalidad RadioButton pero una interfaz de usuario completamente diferente. Mi RadioButton tiene un texto, una imagen, ningún botón, una línea (rectángulo) debajo del texto. Si RadioButton no está seleccionado, el texto y la imagen son transparentes, la imagen está grayscaled y el rectángulo no visible. Si se selecciona, el texto y la imagen son opacos, la imagen es de color y el rectángulo se vuelve visible (todos los cambios a través de la animación).

Sé cómo despellejar un control existente de JavaFX 2.0, pero no sé cómo estilo/piel el RadioButton de esta manera.

En WPF simplemente creo una nueva plantilla para mi estilo de RadioButton ... como mencioné, tal vez estas expectativas influenciadas por WPF para JavaFX 2.0 son mi obstáculo.

Gracias ...

Editar:

parece que no es posible crear otra plantilla para los controles existentes (?): JavaFX 2.0 render controls inside control

Entonces, ¿cuál será la mejor manera de poner en práctica mi RadioButton? Me preocupa el ToggleGroup ...

+0

¿Puede insertar imágenes de los estados seleccionados y no seleccionados? – jewelsea

+0

Posible, pero no necesario, ya que la imagen será transparente y grayscaled si no se selecciona. – thinkU

+0

Perdón por la confusión, me refiero a imágenes de lugares de cómo deben ser los estados de los botones en la pregunta para que sea más fácil formular una respuesta que resuelva su caso de manera más directa. – jewelsea

Respuesta

5

Existen numerosos enfoques para el estilo o la plantilla de controles JavaFX.

  1. controles pre-construido JavaFX son styleable través css.

  2. Los controles JavaFX preconstruidos también se pueden subclasificar para modificar su funcionalidad y aspecto. Un example es el IntField, que crea un TextField personalizado para editar solo números enteros.

  3. A menudo, puede crear componentes personalizados colocando un conjunto de controles existentes juntos en un diseño Pane o Group. Al parametrizar el método o la clase que construye el componente amalgamado, puede moldear de manera efectiva la construcción de componentes personalizados a través del código. Aquí hay un ejemplo de digital and analogue clock components construido usando dicho método (y con estilo mediante css).

  4. También puede administrar el diseño de un componente personalizado a través de diferentes archivos fxml utilizando el enfoque en el introduction to fxml document. El fxml podría generarse a partir de un lenguaje de plantillas como velocity, o podrían escribirse algunos archivos fxml estáticos diferentes para diferentes diseños. El archivo fxml estático o generado también se puede servir dinámicamente desde un servidor web, como un sitio html generado dinámicamente si es necesario.

  5. Otra forma en que puedes crear control personalizado es la misma que hace el equipo JavaFX (creando clases de máscara y comportamiento para el control). A partir de JavaFX 2.2 (y quizás incluso en futuras versiones de JavaFX), esto es más apropiado para creadores de bibliotecas, como los que trabajan en jfxtras o que contribuyen directamente al open source control repository del proyecto JavaFX.

  6. También tenga en cuenta que, en css, puede especificar una clase de piel para un control, por ejemplo RadioButton tiene la siguiente CSS:

 
    .radio-button { 
     -fx-skin: "com.sun.javafx.scene.control.skin.RadioButtonSkin"; 
    } 

Por lo tanto, una manera de personalizar el RadioButton parecer tan lo que está considerando es:

  1. Obtenga una copia de la fuente de clase RadioButtonSkin del repositorio JavaFX de código abierto que vinculé anteriormente.
  2. Cópielo en un nuevo nombre de clase (por ejemplo, LinedRadioButtonSkin).
  3. Modifíquelo para obtener el aspecto que desea.
  4. Crea una hoja de estilo css personalizada para tu proyecto.
  5. En la hoja de estilo CSS personalizada, establezca el atributo -fx-skin de la clase .radio-button para usar su nueva clase LinedRadioButtonSkin.

Mientras su nueva piel se aplica correctamente y conectado a la clase ButtonBehaviour existente similar a cómo funciona la clase RadioButtonSkin existentes, entonces usted debe conseguir de forma automática el mismo comportamiento para su nuevo botón de radio basada piel, radio existente botones. Por ejemplo, el botón responderá a los clics del mouse, aceleradores de teclado, eventos táctiles, interactuar con ToggleGroups, etc., exactamente igual que el RadioButtonSkin existente y ser accesible usando la API existente RadioButton. Es decir, el botón conserva la sensación (comportamiento) de un RadioButton pero puede tener un aspecto completamente diferente al usar diferentes componentes internos, diseño y estilo css.

Si decide ir por la ruta de skin personalizada y necesita ayuda en este proceso, considere ponerse en contacto con miembros del equipo de jfxtras y donar su nuevo skin para el proyecto jfxtras.

Advertencia

la piel y las clases de comportamiento en JavaFX 2.2 son las API de ejecución privada, no apis con apoyo público y cambiarán en el futuro, ya que la transición a la API pública (programado para la próxima versión de JavaFX - JavaFX/JDK 8), así que si los usa hoy, hágalo con precaución. Una vez que pasen a las API públicas, espero que vean más información y tutoriales sobre cómo crear sus propios controles utilizando estas clases.

Los nombres de los paquetes y los métodos api cambiarán a medida que la API construya sus propios controles desde las transiciones Piel y Comportamiento de la implementación privada interna a la API pública. Por ejemplo, com.sun.javafx.scene.control.behavior.BehaviorBase podría convertirse en javafx.scene.control.behavior.Behavior, por lo que si crea una clase que amplíe BehaviorBase, no se ejecutará contra una nueva versión de JavaFX hasta que modifique el origen de la clase para hacer referencia al nuevo nombre y api y recompilarlo. Por esta misma razón, no habrá buenos libros sobre este tema hasta que la API sea pública y final porque cualquier código de ejemplo incluido en el libro que se escribió contra la API privada estaría desactualizado tan pronto como se realice la API público y no compilaría contra la API pública, ni ejecutaría contra la versión más nueva de JavaFX.

+0

Muchas gracias, Jewelsea! Toda la información que quería y me perdí en dos libros. (6) parece ser como la "plantilla WPF" que usé. Probaré (5) y (6) ... ya estoy emocionado. P.S .: ¿Puedes sugerir un buen libro? P.P.S: ¿No entiendo por qué utilizar las API de implementaciones privadas con precaución? – thinkU

+0

Información actualizada de advertencia para responder sus preguntas. – jewelsea

Cuestiones relacionadas