tipos programacion paradigmas paradigma imperativa funcional ejemplo diferencias declarativo declarativa java swing user-interface layout declarative

programacion - sugerencias para la programación declarativa de GUI en Java



programacion imperativa (14)

Me pregunto si hay alguna sugerencia para la programación declarativa de GUI en Java. (Aborrezco el software de editor / creador de GUI visual, pero estoy un poco cansado de instanciar manualmente JPanels y Boxes y JLabels y JLists, etc.)

Esa es mi pregunta general, pero tengo dos preguntas específicas para los enfoques que estoy pensando tomar:

  1. JavaFX: ¿hay algún ejemplo en alguna parte de una pantalla GUI realista (por ejemplo, no círculos y rectángulos, sino listboxes y botones y etiquetas y similares) en JavaFX, que puede interactuar con un archivo fuente Java que accede y actualiza varios elementos?

  2. Plain Old Swing con algo para analizar XUL-ish XML: ¿alguien ha inventado una sintaxis declarativa (como XUL) para XML para usar con Java Swing? Supongo que no sería difícil de hacer, crear un código basado en STaX que lea un archivo XML, crea una instancia de una jerarquía de elementos Swing y haga que la jerarquía sea accesible a través de algún tipo de modelo de objetos. Pero preferiría usar algo que es bien conocido, documentado y probado que intentar inventar tal cosa yo mismo.

  3. JGoodies Forms : no exactamente declarativo, pero algo cercano y he tenido buena suerte con JGoodies Binding. Pero su sintaxis para el diseño de formularios parece algo críptica.

editar: ¡ muchas respuestas excelentes aquí! (Y agregué el n. ° 3 anterior) Estaría especialmente agradecido por escuchar cualquier experiencia que alguno de ustedes haya tenido con el uso de uno de estos marcos para aplicaciones del mundo real.

ps. Intenté algunas búsquedas en google ("java gui declarative"), pero no sabía muy bien qué buscar.


Aunque no es declarativo y se limita exclusivamente a los diseños, es posible que desee echar un vistazo a DesignGridLayout que permite definir de forma programática los diseños de Swing de una manera muy concisa (es de código abierto).

Ventajas principales:

  • fácil y rápido de aprender.
  • código conciso (1 línea de código por fila de componentes en un formulario) que también permite un fácil mantenimiento
  • verificación en tiempo de compilación (qué IU declarativa no puede tener)
  • respeto del aspecto y tacto de la plataforma (alineación de la línea base, espacios entre componentes ...) sin ningún valor de longitud codificado

Como autor de CookSwing, una herramienta que hace lo que necesita, le he dado una dura mirada a este tema antes de llevarlo a cabo. Me ganaba la vida escribiendo aplicaciones Java Swing GUI.

IMO, si va a utilizar cualquier tipo de lenguajes de programación imperativos para describir el componente Java Swing, también podría usar Java. Groovy etc. solo agrega complicaciones sin mucha simplificación.

Los lenguajes declarativos son mucho mejores, porque incluso los que no son programadores pueden tener sentido, especialmente cuando se necesita delegar la tarea de ajustar los diseños específicos a los artistas. XML es perfecto para lenguajes declarativos (en lugar de otras opciones) debido a la simplicidad, legibilidad, y muchos editores / herramientas de transformación, etc. disponibles.

Estos son los problemas que se enfrentan en la programación de la GUI declarativa, no en un orden particular. Estos problemas han sido abordados en CookSwing.

  1. Legibilidad y simplicidad (JavaFX no es más simple que XML. Cerrar las etiquetas de XML ayuda a leer bastante, y no agrega mucho tipeo adicional ya que los editores de XML generalmente lo hacen por usted)
  2. Extensibilidad. Muy importante, porque los componentes Swing personalizados surgirán para cualquier proyecto no trivial.
  3. Diseños de GUI. También muy importante. Ser capaz de manejar BorderLayout, GridBagLayout, JGoodies FormsLayout, etc. son prácticamente obligatorios.
  4. Simplicidad de copiar / pegar. En el curso del diseño del diseño, es necesario probar otros diferentes. Entonces uno debe poder copiar / pegar y mover cosas. XML es mejor porque la jerarquía de componentes y diseños es fácil de ver. JavaFX es un tanto problemático debido a los atributos de múltiples líneas y problemas de sangría. Tener un buen editor es imprescindible, y hay muchos buenos editores de XML.
  5. Las plantillas (es decir, la posibilidad de incluir otro archivo de diseño) son muy útiles para un aspecto uniforme. Por ejemplo, uno podría querer tener un aspecto consistente de diálogos, paneles de botones, etc.
  6. Interacciones con código Java. Esto es crucial. Algunos componentes de GUI solo se pueden crear con código Java (por la razón que sea). Por lo tanto, es necesario poder cargar estos objetos. También es necesariamente capaz de conectar directamente oyentes y otros objetos / componentes Java dentro del código XML. Usar identificadores para conectarlos más tarde NO funcionará bien, ya que es muy tedioso.
  7. Internacionalización (i18n). Poder cargar texto / cadena desde un paquete de recursos en lugar de texto codificado. Esta característica puede ser crucial para algunas aplicaciones.
  8. Localización (l10n). La ventaja de la programación declarativa (especialmente con XML) es que puede cambiar a un formulario de GUI diferente para una configuración regional específica y eso es todo. Si codifica con Java o cualquier otro idioma imperativo, no es tan fácil.
  9. Error de verificación / tolerancia. Los diseños iniciales a menudo contienen errores aquí y allá. A veces, el error puede deberse a que el código de Java correspondiente aún no se ha diseñado. O falta un recurso de icono. Lidiar con errores con codificación imperativa es extremadamente tedioso. Por lo tanto, es deseable poder localizar los errores, pero al mismo tiempo ser tolerante a los errores, por lo que la vista previa del diseño de la GUI se puede realizar lo antes posible.
  10. Reemplazo del componente GUI. Es decir, reemplaza el campo de texto que solía tener JTextField con una versión más elegante de los componentes. Reemplace el significado del diálogo con algunos diálogos de IU extravagantes (como JIDE) en lugar de JDialog. Esta característica puede ahorrar una cantidad significativa de esfuerzos. XML en sí también es útil debido a XSLT y otras herramientas de transformación.
  11. Más allá de Swing. Porque tarde o temprano encontrarás muchas configuraciones de componentes que usan tipos de objetos como matrices, iconos, imágenes, vectores, etc.

Con frecuencia, siempre es una buena idea realizar una búsqueda cuando estás buscando algo. This es el primer enlace en google mientras busca "java xml gui"


He intentado muchas soluciones, como SWIXML, Javabuilders, MigLayout, Cookswing. Finalmente encontré el javaFX y el javaFX-Scenebuilder la mejor y más rápida herramienta de GUI basada en XML. te gustaría la forma en que el generador de escenas crea una GUI (con elementos de arrastrar y soltar). Además, usa CSS (hojas de estilo en cascada) para el tema de la GUI. Jsut confía en Oracle, es la mejor herramienta de GUI para aplicaciones Java. haga un recorrido para crear aplicaciones javaFX con scenebuilder, aquí: http://docs.oracle.com/javafx/scenebuilder/1/get_started/prepare-for-tutorial.htm#CEGJBHHA


Puede echarle un vistazo a javabuilders ; usa YAML para construir UI Swing.

Un ejemplo simple del manual [PDF]:

JFrame: name: myFrame title: My Frame content: - JLabel: name: myLabel2 text: My First Label - JLabel: name: myLabel2 text: My Second Label

Alternativamente:

JFrame: name: myFrame title: My Frame content: - JLabel: {name: myLabel2, text: My First Label} - JLabel: {name: myLabel2, text: My Second Label}

O incluso:

JFrame(name=myFrame,title=My Frame): - JLabel(name=myLabel2, text=My First Label) - JLabel(name=myLabel2, text=My Second Label)




Recomiendo encarecidamente MiG Layout : lleva unos días acostumbrarse a la sintaxis, pero una vez que la tienes, funciona de maravilla. Utilicé JGoodies Forms por bastante tiempo, y el concepto de constructor de Karsten funciona bien, pero es un poco críptico ... MiG es más fácil de recoger y resulta en un código maravillosamente conciso.


Si está dispuesto a avanzar ligeramente fuera de Java, el concepto de "generador" de Groovy funciona bastante bien con las GUI. Por supuesto, puede interoperar entre Groovy y Java con bastante facilidad. Consulte la página Swing Builder para obtener más información.


Si la concisión es importante, es posible que desee considerar la expresión idiomática doble:

new JFrame("My Frame") {{ setName("myFrame"); add(new JLabel("My First Label") {{ setName("myLabel2"); }}; add(new JLabel("My Second Label") {{ setName("myLabel2"); }}; }}

Entonces no pierde el poder de un lenguaje de programación de propósito general bien conocido (usted sabe que lo va a necesitar, y JellyTags es una mierda). Todo lo que necesitas es una pequeña expresión extra.

No se usa mucho, porque en realidad la gente meneando con XML no estaba resolviendo puntos dolorosos reales.

En general, puede usar capas de constructor para abstraer código repetido. El código GUI no tiene que estar mal escrito, es solo que casi todo (incluso en libros de texto).


algo nuevo ... XWT , se incluirá en eclipse e4


dale una oportunidad a Swiby: http://swiby.codehaus.org/

"Swiby es una mezcla de Swing y Ruby para aplicaciones realmente ricas distribuidas". En otras palabras, Swiby es un lenguaje específico de dominio que mezcla swing y ruby.


WindowBuilder , es un plugin muy bueno, que incluye GWT, XWT, SWT, Swing, etc.


SDL/Swing hace exactamente lo que necesita. Es un marco Swing declarativo pequeño (283k), discreto, fácil de aprender.

menus { "File" { "Open" do="open" // calls "open()" in the controller "---" "Exit" do="exit" } }

SDL / Swing es de código abierto pero goza de soporte comercial. Nosotros (Ikayzo.com) lo desarrollamos durante un período de años y lo hemos implementado en sistemas de producción para muchos clientes, desde empresas de ciencias de la vida hasta bancos.