¿Cuáles son las mejores prácticas del desarrollo Java Swing?

17

Mientras hacía mi investigación previa para esta pregunta , descubrí que no hay mucha información bien organizada sobre las mejores prácticas de Java Swing en Internet. Así que supongo que le daré una oportunidad a Stack Exchange para construir esa Gran Lista.

¿Cuáles son las mejores prácticas del desarrollo Java Swing? ¿Qué has encontrado que funcione para ti y por qué?

Estallidos
fuente
2
Jugué con Swing en la escuela, y no fue una experiencia agradable. Todo parecía hinchado e innecesariamente complejo. La mejor práctica puede ser usar otra cosa.
Robert Harvey
1
@RobertHarvey "jugar en la escuela" está muy lejos de ofrecer software de producción. Descubrí que Swing puede hacer todo lo que se le exige de una manera razonable y lógica.
Bueno, dígalo de esta manera: si fuera tan difícil en un simple proyecto escolar, sería casi inimaginablemente difícil en uno real.
Robert Harvey
1
@RobertHarvey power tiene un precio ...
Solo una cosa más importante. Los componentes Swing son serializables y tienen muchos antepasados. Por lo tanto, son demasiado pesados ​​para heredar en la mayoría de los casos. Debe considerar alguna técnica de ajuste, especialmente cuando tiene un estado no serializable. Si hereda de un componente, simplemente utilícelo como una vista (en MVC o un patrón similar).
Dávid Horváth

Respuestas:

12

Solo puedo responder por lo que funcionó para mí. Otros comentaristas han señalado que las GUI de Java en general caen en el 'valle misterioso' de la apariencia y sensación no nativas, y no lo niego.

Haz buen uso de la API de acción. Le permite encapsular mejor las diferentes acciones que realizará su usuario y le permite conectarlos a atajos, teclas de aceleración, botones y otros objetos de entrada con mucha más facilidad.

Use un administrador de diseño apropiado. GridBagLayout es extremadamente poderoso, pero iría tan lejos como para decir que es imposible de mantener sin una cantidad excesiva de comentarios. Cuando ejecuto herramientas de análisis de código estático como Sonar sobre una aplicación GUI anterior que mantengo, siempre señala las cantidades masivas de números mágicos para que el diseño de GridBags sea el correcto. He tenido mucho éxito con GroupLayout, que evita tener que especificar la alineación perfecta de píxeles.

Si crees que necesitas un JDialog ... probablemente no lo necesites . Los cuadros de diálogo son horribles, en términos de experiencia del usuario: esta aplicación decidió usarlos para cada menú y forma, y ​​hacer cumplir las reglas siempre en la cima de maneras extrañas. Esto se convirtió en una pesadilla de mantenimiento cuando realmente necesitábamos alertar algo sobre el menú. Haga clic en los cuadros de diálogo no enfocados y, por lo tanto, imperdibles.

Use SwingWorker en lugar de rodar su propio subproceso múltiple, cuando corresponda. Es muy fácil extender SwingWorker y realizar tareas de larga duración mientras se proporcionan actualizaciones periódicas a la GUI. Piense en descargar una actualización del cliente. Se encargará de la programación de subprocesos de trabajo por usted y le permitirá publicar porcentajes de descarga de nuevo a la vista, para que pueda actualizar su ProgressBar o lo que sea.

Eso es todo lo que puedo sugerir, en mi experiencia ciertamente limitada.

Tom G
fuente
2
JDialogestá perfectamente bien, siempre que lo use para diálogos.
Jonas
1
Estoy de acuerdo en que están bien si los está utilizando para obtener información que debe verse absolutamente y actuar de inmediato. Pero la mayoría de la información realmente no necesita interrumpir tanto la experiencia del usuario. Ese fue el punto detrás de mi clasificatorio.
Tom G
@Jonas Creo que el punto es que los diálogos son algo malo (independientemente de si se implementan con JDialogo no).
Tom Hawtin - tackline
1
El acoplamiento es un poco maloliente, pero es mejor IMO que escribir su propio código de subprocesos. Prefiero lidiar con el código poco elegante que los errores de hilo sutiles.
Tom G
3
Es posible que desee ver MigLayout - miglayout.com
4

Yo diría que una de las primeras cosas es no trabajar directamente en ello. El sistema de diseño en Swing (en mi humilde opinión) es terrible, y tratar de hacer una aplicación sustancial es una pesadilla.

Dos de los muchos gerentes de diseño alternativos que he usado son el diseño MigLayout y MultiSplitPane. MigLayout tiene un propósito más general y crea cualquier diseño en el que pueda pensar de una manera fácil y sensata. MultiSplitPane es más específico; Lo usé para hacer algunos diseños simples para GUI que no tenían mucha complejidad.

EDITAR : esto no reemplaza el swing . Si tiene que usar Swing, aún puede usar estos administradores de diseño, ya que solo administran swing, no lo reemplazan.


Por supuesto, la mejor alternativa es simplemente no usar Swing. Swing es muy criticado por ser horrible para trabajar, no parece nativo y lento. Existen muchas alternativas que han aprendido de swing qué no hacer como Qt, SWT, y creo que incluso GTK. Estas son excelentes soluciones a largo plazo para los dolores de cabeza de Swing

EDITAR : Como dijo @Lord Torgamus, estos no están realmente disponibles si te ves obligado a usar Swing. Si va a utilizar estos, es mejor resolver esto cuando cree su proyecto, no 3/4 de camino o cuando elija aplicaciones heredadas.

También me gustaría señalar que la mayoría de las GUI alternativas usan bibliotecas nativas para parecerse al sistema operativo, luego recurren a Swing o alguna otra GUI de Java puro.

TheLQ
fuente
44
Agradezco su opinión, pero "no usar Swing" no es útil para las personas que terminan en esta pregunta porque se ven obligados a usar Swing por una razón u otra.
Aparece el
@ Señor Por eso sugerí gerentes de diseño alternativos antes de sugerir QT y SWT. Usa cualquier camino que puedas.
TheLQ
"El sistema de diseño en Swing (en mi humilde opinión) es terrible, y tratar de hacer una aplicación sustancial es una pesadilla". Los gerentes de diseño tienden a provenir de AWT, no de Swing. Por supuesto, hay algunos específicos de Swing, como BoxLayout y GroupLayout. Dicho esto, los administradores de diseño son completamente opcionales ... en su lugar, puede especificar las coordenadas para cada componente al igual que lo hace en .NET WinForms (excepto .NET tiene una buena GUI para hacerlo por usted).
Powerlord
3
Eche un vistazo a MigLayout - miglayout.com
1
@TheLQ Ok, estoy de acuerdo con el administrador de archivos de Swing, ese es realmente estúpido (en Mac OS X también). De todos modos, solo uso el administrador de archivos de AWT para arreglar eso. Funciona bien incluso si el resto de la aplicación se realiza mediante Swing.
stommestack