css - style - Estructura del proyecto JavaFX
propiedades css javafx (1)
En mi humilde opinión, ¡no deberías crear paquetes dependiendo de la pantalla!
Mi enfoque hacia tales aplicaciones
- Un paquete para los
controllers
correspondientes de estasviews
- Paquete diferente para capa de servicio (negocio) y dao (persistencia), si existe
- Un paquete / carpeta para recursos tales como imágenes, css, etc.
Un paquete para fxml llamado
view
en los recursossrc/main/java | controllers | Screen1controller.java Screen2controller.java service | Service1.java dao(persist) | SaveProducts.java src/main/resources | view | screen1.fxml screen2.fxml css | style.css | images | img1.jpg img2.jpg
La implementación anterior se puede considerar para un proyecto Maven
.
Para un proyecto simple, puede ver una estructura aquí . Es un proyecto maven!
El modelo MVC de JavaFX utilizando FXML suena increíble y todo, pero tengo problemas para descubrir cómo organizar mis paquetes de proyectos.
Todos y cada uno de los tutoriales que encuentro sobre JavaFX son demasiado simples y desorganizados: simplemente crean UN paquete y crean todo allí, cada controlador, cada archivo fxml, cada CSS. No quiero eso. Quiero que las cosas estén en su lugar correcto.
Aún así, la "ruta" de JavaFX parece ... "limitativa". El uso de URL hace que si quiero limitar mis recursos a archivos locales, tengo que hacer todo el asunto getClass().getResource("foo.fxml").openStream()
. Eso es genial, pero al obtener recursos de una ruta de clase, la ruta es del paquete en el que está la clase. Quería un poco la raíz del proyecto. Eso simplificaría mi vida, pero JavaFX no parece funcionar así.
Veamos un ejemplo práctico:
Imagina que tengo una "pantalla de inicio de sesión" de FXML. Imagine que quiero que la pantalla de inicio de sesión use una hoja de estilo. Idealmente, ese CSS estaría en el mismo paquete de ese fxml. Pero, ¿qué sucede si quiero usar el mismo .css en otro FXML? ¿Eso significa que tengo que colocar ambos FXML en el mismo paquete? Obviamente, "no necesito hacerlo", pero ¿cómo lo hago entonces?
Además, digamos que quiero cambiar de escena cuando inicio sesión correctamente. En el evento adecuado del controlador FXML, tendría que llamar a un "setScene". Esa ruta también sería difícil de obtener ya que si tengo los FXML en diferentes paquetes. Simplemente parece que o todo está en un paquete hinchado gigante o todo es difícil de acceder sin recurrir a hacks como "../../dir".
La aplicación Henley Sales en http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm parece ser un ejemplo de una aplicación bien organizada, aunque la aplicación es un solo TabPane. Desafortunadamente (al menos creo) la fuente no está abierta. Su idea es algo como esto:
client Main.class styles.css client.images image.png client.screen1 Screen1.fxml Screen1Controller.java client.screen2 Screen2.fxml Screen2Controller.java ...
Este doenst parece un mal comienzo, pero tiene algunos problemas (o al menos los veo como problemas).
Para ''The Henley Sales'', es inteligente tener un Main que llamaría a uno de los paquetes ''FXML (fácil acceso, los directorios de FXML están por debajo de Main class). Aún así, para la hoja de estilo, eso tendría que estar codificado por scene.getStylesheets().add(...);
. Realmente preferiría tener la opción de elegir mi hoja de estilos en el FXML. Después de todo, la hoja de estilo es parte del componente Ver. Acceder al archivo .css desde una URL en el FXML sería un poco difícil con esta estructura, ya que está por encima de sus directorios.
Además, con esta organización, ¿cómo cambiaría la escena de forma completa? En este proyecto, eso no es necesario porque todo el proyecto es un solo TabbedPane. Main lo llama, y está hecho. No hay necesidad de más swaps. Pero una simple escena de inicio de sesión (o cualquiera que sea la razón por la que uno debería cambiar toda la escena) exige la necesidad de acceder a las rutas FXML.
Y luego están los recursos. Es posible que los archivos CSS necesiten usar imágenes. Esa estructura lo resuelve colocando el archivo .css en la parte superior y creando un paquete solo para los archivos que el archivo .css podría necesitar. Si quisiera que un FXML en particular tuviera un .css diferente, sin embargo, llegaría otro problema.
Parece un ciclo. Css necesita acceso a una carpeta de recursos compartidos. FXML necesita acceso a Css. Los controladores de FXML necesitan acceso a otros FXML. Espero tener claras las dudas sobre la estructura de mi proyecto. Ayúdenme a crear una estructura de proyecto JavaFX que sea lo suficientemente potente para una aplicación más que básica, o redirigirme a un buen código fuente.
Oh, estoy usando Netbeans por cierto.