Java GUI frameworks. Que elegir Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot? [cerrado]

228

Hay bastantes marcos de interfaz gráfica de usuario para Java, pero ¿cuál se reconoce como el marco de elección actual?

Lo siguiente es mi comprensión de los diferentes marcos, corríjame si estoy equivocado. Este es un conjunto de preguntas muy poco definido, pero sigo pensando que es valioso para cualquiera que esté pensando en crear aplicaciones ricas de GUI.


AWT

Es la base del swing, funciona bien pero carece de componentes avanzados. Si tiene la intención de crear aplicaciones ricas, AWT probablemente no sea el camino a seguir. Sin embargo, para aplicaciones GUI más pequeñas que no requieren interfaces de usuario enriquecidas. Esto podría encajar perfectamente, ya que es un marco probado y probado.


Columpio

Basado en AWT como se indicó anteriormente. En su infancia, se consideraba lento y con errores, e hizo que IBM creara SWT para Eclipse. Sin embargo, con Java 5 (¿o 6?) Swing se convirtió en el marco de elección para crear nuevas aplicaciones. Swing tiene muchos componentes ricos, pero aún faltan en algunas áreas. Un ejemplo es que no hay un componente TreeTable con todas las funciones que pueda ordenar y filtrar / buscar.


SWT

Creado por IBM para Eclipse, parecían pensar que Swing no era adecuado para Eclipse en ese momento. Por sí solo es de bajo nivel, y utiliza los widgets nativos de la plataforma a través de JNI. No está relacionado con Swing y AWT en absoluto. Sin embargo, su API es algo torpe y no intuitiva. Tienen algunos componentes avanzados como una TreeTable. (pero no creo que admitan la clasificación y el filtrado fuera de la caja). SWT utiliza algunos enlaces nativos (¿a través de JNI?) Y la queja en Internet es que este marco no debe usarse en los proyectos de hoy. (¿Por qué no?)


SwingX

Basado en Swing y su misión es crear componentes ricos para swing. Aún en desarrollo. (aunque no muy activo). Tenga un conjunto de componentes muy agradable, como por ejemplo TreeTable. Pero la TreeTable no admite el filtrado y la clasificación hasta donde yo sé. Sin embargo, admite la búsqueda con resaltado.

Tenga en cuenta que SwingX son componentes (AFAIU) que son extensiones o composiciones de componentes Swing existentes


JGoodies

Un marco del que no sé nada ... ¿Cuáles son sus fortalezas y debilidades? ¿Qué distingue a Jgoodies del resto?

JGoodies OTOH se trata de PLAF y diseños.


JavaFX

El último buque insignia de Java / Oracle. promete ser el estándar de facto en el desarrollo de aplicaciones web o de escritorio enriquecidas.


Pivote Apache

Representa la interfaz de usuario utilizando Java2D, minimizando así el impacto de los legados (IMO, hinchado) de Swing y AWT. (@Augustus Thoo)

Su enfoque principal parece estar en RIA (aplicaciones de Internet enriquecidas), pero parece que también se puede aplicar a aplicaciones de escritorio. Y como comentario personal, ¡parece muy interesante! Me gusta especialmente que sea un proyecto apache.

https://cwiki.apache.org/PIVOT/frequently-asked-questions-faq.html


Qt Jambi

Un contenedor de Java para la biblioteca qt nativa que está escrita en c / c ++. Muy potente, ampliamente utilizado y aceptado. Tiene muchos componentes GUI y una API fácil de usar.

http://qt-jambi.org/


Entonces, para tratar de resumir un poco de lo que estoy preguntando:

Digamos que quería crear una aplicación de escritorio hoy en Java que involucra muchos componentes avanzados, ¿qué debo elegir? ¿Y por qué?

¿Cuál de estos marcos debería reconocerse como obsoleto y cuáles deberían reconocerse como marcos del futuro lejano?

¿Cuál es el marco de facto-estándar de hoy y qué herramientas utiliza para crear aplicaciones Java GUI?


Podría lamentar preguntar esto, pero lo intentaré de todos modos:

Se dice que C # /. Net tiene un muy buen conjunto de componentes fáciles de usar que se pueden flexionar en todas las direcciones posibles. Y después de investigar diferentes marcos de Java hasta cierto punto, parece que no puedo decir lo mismo sobre Java. ¿Por qué es esto? ¿Por qué Java (que es el lenguaje de programación más utilizado en el mundo) no tiene el mismo conjunto de componentes GUI?

¿Es solo que Java ha basado sus componentes de interfaz gráfica de usuario en un nivel mucho más bajo, y es posible escribir todos estos componentes avanzados que estoy buscando, pero usted tiene que hacer mucho, si no todo, el trabajo usted mismo?

netbrain
fuente
No sabía que SWT estaba "basado en una combinación de AWT y Swing". ¿Es realmente el caso? Pensé que era puro JNI invocar el sistema de ventanas del sistema operativo ...
Rich
@ Rich Oh, se dijo en uno de los comentarios de respuestas. Supuse que sabían de lo que estaban hablando.
netbrain
44
Creo que confunde "UI Toolkit" y "GUI framework". AWT, Swing y SWT son kits de herramientas de interfaz de usuario, pero ciertamente no los llamaría "frameworks". Los marcos se basan en un conjunto de herramientas de interfaz de usuario dado y proporcionan el pegamento para construir su aplicación. Primero, debe elegir el kit de herramientas de la interfaz de usuario y luego elegir un marco que funcione en ese kit de herramientas. FWIW, elegiría Swing con mi propio marco Guts-GUI
casero
1
Casi siempre es Swing vs. SWT (al menos para mí), para una pequeña comparación, puede consultar ¿Cuáles son las principales cosas que un programador Java SWT experimentado debe tener en cuenta al pasar a Swing? ..
Sorceror
2
JavaFX ya no forma parte del SDK de vista previa y está disponible para uso en Producción. por favor actualiza esta publicación.

Respuestas:

79

Árbol de decisión:

  1. Los marcos como Qt y SWT necesitan archivos DLL nativos. Entonces debe preguntarse: ¿son compatibles todas las plataformas necesarias? ¿Puedes empaquetar las DLL nativas con tu aplicación?

    Vea aquí, cómo hacer esto para SWT .

    Si tiene una opción aquí, debería preferir Qt sobre SWT. Qt ha sido desarrollado por personas que entienden la interfaz de usuario y el escritorio, mientras que SWT se ha desarrollado por necesidad para hacer que Eclipse sea más rápido. Es más un parche de rendimiento para Java 1.4 que un marco de interfaz de usuario. Sin JFace, le faltan muchos componentes principales de la interfaz de usuario o características muy importantes de los componentes de la interfaz de usuario (como el filtrado en las tablas).

    Si a SWT le falta una característica que necesita, el marco es algo hostil para extenderla. Por ejemplo, no puede extender ninguna clase en él (las clases no son finales, solo lanzan excepciones cuando el paquete de this.getClass()no es org.eclipse.swty no puede agregar nuevas clases en ese paquete porque está firmado).

  2. Si necesita una solución nativa y pura de Java, eso le deja con el resto. Comencemos con AWT, Swing, SwingX: la forma Swing.

    AWT está desactualizado. Swing está desactualizado (quizás menos pero no se ha trabajado mucho en Swing durante los últimos 10 años). Se podría argumentar que Swing fue bueno para empezar, pero todos sabemos que el código se pudre. Y eso es especialmente cierto para las IU de hoy.

    Eso te deja con SwingX. Después de un período más largo de progreso lento, el desarrollo se ha recuperado nuevamente . El mayor inconveniente de Swing es que se aferra a algunas ideas antiguas que eran muy sangrientas hace 15 años pero que hoy se sienten "torpes". Por ejemplo, las vistas de tabla admiten el filtrado y la ordenación, pero aún debe configurar esto. Tendrá que escribir una gran cantidad de código de placa de caldera solo para obtener una interfaz de usuario decente que se sienta moderna.

    Otra área débil es el tema. A partir de hoy, hay muchos temas alrededor. Vea aquí para un top 10 . Pero algunos son lentos, algunos tienen errores, algunos están incompletos. Odio cuando escribo una interfaz de usuario y los usuarios se quejan de que algo no funciona para ellos porque seleccionaron un tema extraño.

  3. JGoodies es otra capa encima de Swing, como SwingX. Trata de hacer que Swing sea más agradable de usar. El sitio web se ve muy bien. Echemos un vistazo al tutorial ... hm ... sigo buscando ... espera. Parece que no hay documentación en el sitio web en absoluto. Google al rescate . No, no hay tutoriales útiles en absoluto.

    No me siento seguro con un marco de interfaz de usuario que se esfuerza tanto por ocultar la documentación de posibles nuevos fanáticos. Eso no significa que JGoodies sea malo; Simplemente no pude encontrar nada bueno que decir al respecto, pero que se ve bien.

  4. JavaFX. Genial, con estilo. El soporte está ahí, pero creo que es más un juguete brillante que un marco de interfaz de usuario serio. Esta sensación radica en la falta de componentes complejos de la interfaz de usuario, como las tablas de árbol. Hay un componente basado en webkit para mostrar HTML .

    Cuando se introdujo, mi primer pensamiento fue "cinco años demasiado tarde". Si su objetivo es una buena aplicación para teléfonos o sitios web, bien. Si su objetivo es una aplicación de escritorio profesional, asegúrese de que ofrezca lo que necesita.

  5. Pivote. La primera vez que escuché sobre eso. Básicamente es un nuevo marco de interfaz de usuario basado en Java2D. Así que lo probé ayer. No Swing, solo un poquito de AWT ( new Font(...)).

    Mi primera impresión fue buena. Existe una extensa documentación que lo ayuda a comenzar. La mayoría de los ejemplos vienen con demostraciones en vivo (Nota: debe tener Java habilitado en su navegador web; esto es un riesgo de seguridad ) en la página web, para que pueda ver el código y la aplicación resultante de lado a lado.

    En mi experiencia, se dedica más esfuerzo al código que a la documentación. Al mirar los documentos de Pivot, se debe haber invertido mucho esfuerzo en el código. Tenga en cuenta que actualmente hay un error que impide que algunos de los ejemplos funcionen ( PIVOT-858 ) en su navegador.

    Mi segunda impresión de Pivot es que es fácil de usar. Cuando me encontraba con un problema, generalmente podía resolverlo rápidamente mirando un ejemplo. Sin embargo, me falta una referencia de todos los estilos que admite cada componente.

    Al igual que con JavaFX, le faltan algunos componentes de nivel superior como un componente de tabla de árbol ( PIVOT-306 ). No intenté cargar con pereza con la vista de tabla. Mi impresión es que si el modelo subyacente usa carga diferida, entonces es suficiente.

    Prometedor. Si puedes, pruébalo.

Aaron Digulla
fuente
Intenté la demostración de Pivot "Fregadero de cocina", después de abrir algunos grupos sigue comiendo CPU completa. Si es por el diseño de Pivot, definitivamente no lo quiero en mis proyectos.
Nombre para mostrar
Parece que encontré la fuente del problema y se solucionó en versiones posteriores: apache-pivot-users.399431.n3.nabble.com/…
Nombre para mostrar
2
JavaFX 8 (para Java 8 y superior) tiene un widget TreeTableView. Sin embargo, JavaFX 2.2 (para Java 7) carece de esto, y también carece de error estándar e información dialgos: consulte stackoverflow.com/a/12760202/105137 . También la biblioteca de widgets ControlsFX está disponible solo para Java 8: fxexperience.com/controlsfx
kostmo
12

SWT en sí mismo es de bastante bajo nivel, y utiliza los widgets nativos de la plataforma a través de JNI. No está relacionado con Swing y AWT en absoluto. El IDE de Eclipse y todas las aplicaciones de cliente enriquecido basadas en Eclipse, como el cliente Vuze BitTorrent , se crean utilizando SWT. Además, si está desarrollando complementos de Eclipse, normalmente usará SWT.
He estado desarrollando aplicaciones y complementos basados ​​en Eclipse durante casi 5 años, por lo que estoy claramente sesgado. Sin embargo, también tengo una amplia experiencia en trabajar con SWT y el kit de herramientas JFace UI, que está construido encima. He encontrado que JFace es muy rico y poderoso; en algunos casos, incluso podría ser la razón principal para elegir SWT. Le permite crear una interfaz de usuario que funcione con bastante rapidez, siempre que sea similar a IDE (con tablas, árboles, controles nativos, etc.). Por supuesto, también puede integrar sus controles personalizados, pero eso requiere un esfuerzo adicional.

Zsolt Török
fuente
En su opinión, ¿un componente avanzado como una TreeTable con clasificación y filtrado de columnas sería un gran problema con SWT + JFace?
netbrain
@netbrain: Lo he hecho varias veces, es bastante sencillo con JFace. Esto es lo que quise decir con una interfaz "IDE-like", tal vez no sea la mejor opción de palabras.
Zsolt Török
9

Me gustaría sugerir otro marco: Apache Pivot http://pivot.apache.org/ .

Lo probé brevemente y me impresionó lo que puede ofrecer como marco RIA (Rich Internet Application) ala Flash.

Representa la interfaz de usuario utilizando Java2D, minimizando así el impacto de los legados (IMO, hinchado) de Swing y AWT.

Augustus Thoo
fuente
1
Tuve la impresión de que netbrain estaba preguntando sobre aplicaciones de escritorio. Para los marcos RIA, considere también GWT y Vaadin. Estos marcos le permiten escribir en Java, compilar y obtener JavaScript que funciona muy bien en todos los navegadores web comunes.
Costis Aivalis
no se puede aplicar pivote para aplicaciones de escritorio?
netbrain
Tal vez sea una cuestión de definición, pero los marcos RIA están diseñados básicamente para ejecutarse en navegadores.
Costis Aivalis
2
@netbrain: Sí, puede ejecutar Pivot como aplicación de escritorio (JFrame) o applet (JApplet).
Augustus Thoo
9

Swing + SwingX + Miglayout es mi combinación de elección. Miglayout es mucho más simple de lo que Swings percibió 200 gestores de diseño diferentes y mucho más potente. Además, le brinda la capacidad de "depurar" sus diseños, lo que es especialmente útil cuando se crean diseños complejos.

método de ayuda
fuente
8

Otra opción es usar Qt Jambi . Tiene casi toda la grandeza de Qt (muchos componentes, buena documentación, fácil de usar), sin la molestia de C ++. Lo utilicé hace 3-4 años para un proyecto pequeño, incluso entonces estaba casi maduro.

Es posible que desee ver la discusión sobre Swing vs. Qt aquí .

nimcap
fuente
5

Mi opinión personal: ir a Swing junto con la plataforma NetBeans.

Si necesita componentes avanzados (más de lo que ofrece NetBeans), puede integrar fácilmente SwingX sin problemas (o JGoodies) ya que la plataforma NetBeans se basa completamente en Swing.

No iniciaría una aplicación de escritorio grande (o una que vaya a ser grande) sin una buena plataforma basada en el marco de la interfaz de usuario subyacente.

La otra opción es SWT junto con Eclipse RCP, pero es más difícil (aunque no imposible) integrar componentes Swing "puros" en dicha aplicación.

La curva de aprendizaje es un poco empinada para la plataforma NetBeans (aunque supongo que eso también es cierto para Eclipse), pero hay algunos buenos libros que recomendaría encarecidamente.

un caballo sin nombre
fuente
1
Tenga en cuenta que SwingX son componentes (AFAIU) que son extensiones o composiciones de componentes Swing existentes. JGoodies OTOH se trata de PLAF y diseños. Pero como dijiste, cualquiera se integrará perfectamente con Swing.
Andrew Thompson
1
+1 Base su desarrollo en Swing. Swing está construido sobre AWT e incluye componentes livianos que se ven y se comportan igual en todas las plataformas, por lo que nunca debe usar componentes AWT directamente. Hay una gran cantidad de excelentes Beans que puede agregar fácilmente a su GUI de desarrollo como, por ejemplo, toedter.com JCalendar.
Costis Aivalis
1
@Andrew además de PLAF y diseño, JGoodies ofrece más: enlace de beans (para el patrón del modelo de presentación), validación y un marco "similar a JSR-296" (ese es comercial).
jfpoilpret
3

olvidó la aplicación Java Desktop basada en JSR296 como Swing Framework incorporado en NetBeans

excluyendo AWT y JavaFX, todos sus frameworks descritos se basan en Swing, si comienza con Swing, entonces comprenderá (claramente) todos estos Swing (marcos basados)

ATW, SWT (Eclipse), Java Desktop Aplication (Netbeans), SwingX, JGoodies

Todos los marcos (no sé algo más sobre JGoodies) incl. JavaFX no ha progresado mucho tiempo, muchos marcos de trabajo basados ​​en Swing están detenidos, si no, sin la versión más reciente

solo mi punto de vista: el mejor de ellos es SwingX, pero requiere un conocimiento más profundo sobre Swing,

Mira y siente los marcos basados ​​en Swing

mKorbel
fuente
parte de ellos en AWT Components, parte en Swing JCompoentns, pero entre AWT y Swing es la diferencia con los métodos implementados, accesibles y heredados, por ejemplo Swing JComponents directamente (API) implementa muchos métodos heredados o anidados directamente desde AWT :-)
mKorbel
El JSR296 está muerto. Ya no se "mantiene" y el soporte para ello se ha eliminado de NetBeans. (Y nunca fue un marco realmente bueno para empezar)
a_horse_with_no_name
@a_horse_with_no_name justo with same progressen SWT, SwingX, nuevo propietario, nuevos modales
mKorbel
1
SWT, desarrollado por IBM, no se basa en Swing, es / era una tecnología competitiva. Swing usa AWT. JavaFX tampoco se basa en Swing. Es un marco completamente nuevo. Algunos lo llaman el sucesor de Swing, pero aún es demasiado inmaduro para llamar a esa batalla. Estoy tomando la misma decisión en este momento, y Swing es mi candidato, simplemente por el hecho de que es la opción más madura y realista disponible.
Gordon
1
SwingX es extensiones de Swing (por lo que requiere conocimiento de Swing), de hecho, algunas de las características de SwingX se han incorporado a Swing.
Gordon
3

Estoy bastante contento con Swing para las aplicaciones de escritorio en las que he estado involucrado. Sin embargo, comparto su opinión sobre Swing que no ofrece componentes avanzados. Lo que he hecho en estos casos es ir a JIDE. No es gratis, pero tampoco es tan costoso y le brinda muchas más herramientas. Específicamente, ofrecen una TreeTable filtrable.

sbrattla
fuente
¡Bueno saber! Entonces JIDE ha creado sus propios componentes basados ​​en Swing ...
netbrain
Sí, JIDE ha hecho bastantes componentes que cubren cuadrículas, árboles, tablas, gráficos y similares. Como dije, no es gratis, pero dado el tiempo que tomaría hacer estas cosas usted mismo, probablemente sea mejor usar algo que ya está hecho. Además, por lo que yo entiendo, JIDE es flexible con respecto a permitir que los proyectos de código abierto usen sus componentes a cambio de un enlace a su sitio web o un logotipo en el cuadro de diálogo 'Acerca de'.
sbrattla
3

Yo iría con Swing. Para el diseño, usaría el diseño de formulario JGoodies. Vale la pena estudiar el documento técnico sobre el diseño del formulario aquí: http://www.jgoodies.com/freeware/forms/

Además, si va a comenzar a desarrollar una gran aplicación de escritorio, definitivamente necesitará un marco. Otros han señalado el marco de netbeans. No me gustó mucho, así que escribí uno nuevo que ahora usamos en mi empresa. Lo puse en sourceforge, pero no encontré el tiempo para documentarlo mucho. Aquí está el enlace para navegar por el código:

http://swingobj.svn.sourceforge.net/viewvc/swingobj/

El escaparate debería mostrarle cómo hacer un inicio de sesión simple en realidad.

Avíseme si tiene alguna pregunta al respecto, podría ayudarlo.

sethu
fuente