sirve settitle que para java user-interface design-patterns swing

java - settitle - ¿Cuáles son tus mejores patrones y consejos de diseño Swing?



para que sirve settitle en java (16)

Adquiera el hábito de hacer que sus devoluciones generen hilos para hacer el trabajo real, y luego no tendrá GUI congeladas cuando una de sus devoluciones de llamadas se convierta en un monstruo que consuma mucho tiempo.

Estoy escribiendo una GUI para una aplicación que usa Swing, y en interés del mantenimiento del código y la legibilidad, quiero seguir un patrón consistente en todo el sistema.

La mayoría de los artículos y libros (o al menos secciones de libros) que he leído parecen proporcionar muchos ejemplos sobre cómo crear y organizar varios componentes, pero ignoran la imagen más grande de escribir una GUI completa.

¿Cuáles son sus mejores consejos para el diseño de la GUI de la aplicación y qué patrones sigue cuando diseña o refactoriza una aplicación GUI?


Creo que el principal problema al que te enfrentarás es la capacidad de prueba de tu aplicación de interfaz gráfica de usuario.

Por lo tanto, con respecto al mantenimiento y la facilidad de las pruebas unitarias, me inclino por la expresión "Presenter first" en lugar de Model View Controller (MVC) y otras derivadas que le indican que debe conocer la lógica de la aplicación (Modelo). El mejor recurso es el sitio web del grupo que lo introdujo como un pensamiento.

Dado que el uso de un enfoque como este va a tomar un montón de código repetitivo para inicializar los diversos elementos de su aplicación, también sugeriría utilizar un marco de inyección de dependencia. Me he conformado con Guice .


Creo que un buen conocimiento práctico de concurrencia a menudo es subestimado. Realmente necesita familiarizarse con la política de enhebrado de Swing y las técnicas generales de sincronización para construir una GUI receptiva y un back-end eficiente.


Definitivamente coloque la GUI en una clase y la lógica en otra clase o múltiples clases, en la mayor medida posible. Si usa el patrón MVC (Modelo-Vista-Controlador) , esto sucederá automáticamente. Si no lo hace, la GUI se volverá inmanejablemente complicada.



Esta es una respuesta de alto nivel más abstracta sobre lo que representa su GUI, no la mecánica de la misma ...

Dependiendo de su tarea, puede ser un poco difícil hacerlo para que su usuario pueda captar conceptualmente lo que está haciendo la GUI. He realizado un trabajo bastante complicado que involucra GUI, y mis enfoques más exitosos han sido aquellos que tomaron un conjunto complejo de controles y los colocaron en un diseño que el usuario esperaba.

Por ejemplo, escribí un sistema para administrar 2 dispositivos uno en cada extremo de una línea T1 (algo así como módems). Los controles eran realmente difíciles de comprender, campos como "crear loopback, probar señales de extremo lejano, probar patrones de bits cercanos al final, enviar varios patrones de bits, ..." (esto es una simplificación excesiva, era mucho peor que esto)

Tenía que entender realmente el problema, así que fui a un representante de soporte técnico que ayudó a los clientes con este problema todo el tiempo. Me mostró un diagrama en el manual y me explicó qué hicieron los diferentes controles en ese diagrama.

Tomé el diagrama, lo recreé usando gráficos (solo un simple dibujo de líneas en su mayor parte, pero mostró los dos extremos y las conexiones entre ellos), luego usé las regiones de los gráficos para representar los controles Y la retroalimentación (cambios de color) . Se podía ver visualmente que se estaba emitiendo una señal. Cuando encendiste un loopback en el otro extremo, pudiste ver que la línea conectaba la señal a su línea de salida, luego podías ver el cambio de color a medida que tu extremo cercano comenzaba a obtener el patrón que estaba enviando era otra línea .

Los "Controles" fueron significativamente más intrincados que esto, pero la GUI lo redujo EXACTAMENTE a lo que el cliente necesitaba para comprender el problema.

Después de esto, tuvimos clientes que volvieron a nosotros diciéndonos que nunca antes habían podido descifrar estas cosas, ¡pero ahora lo entienden totalmente!

Esta presentación fue infinitamente más importante que el cableado de la implementación de GUI.


Evite el uso de diseñadores de diseño de GUI (constructores). Más tarde, hará que su código sea mucho más limpio y fácil de mantener.


Evite generar demasiados hilos cuando el usuario haga clic en el botón de acción varias veces. Desactive el botón al primer clic, genere su acción en el hilo de fondo y, cuando termine, vuelva a habilitar el botón. Esto puede no ser un problema para tareas de ejecución corta.


Evite heredar cuando la composición sea más fácil.

Por ejemplo, he visto mucho como esto:

public class CustomerSupportApp extends JFrame { JList<Customer> customers; OtherBusinessComponent importantComponent; etc. etc }

Esto es mezclar la lógica de negocios con la presentación. Solo hace cambios de difíciles a imposibles.

Mejor es:

public class CustomerSupportApp { JList<Customer> customers; OtherBusinessComponent importantComponent; // The app HAS-A frame but not IS-A frame JFrame frame; etc. etc }


Haz un uso intensivo del patrón MVC. Aquí hay un ejemplo simple de lo que quiero decir:

class Person { String firstName; String lastName; // and getters and setters... } class PersonSwingModel { private Person person; private javax.swing.text.PlainDocument firstName; private javax.swing.text.PlainDocument lastName; // and getters and setters... // Create some method like init() that initializes PlainDocument values // to attributes in model. } class SavePersonAction extends AbstractAction { private PersonSwingModel model; // and getters and setters... } class PersonSwingView extends JFrame { private PersonSwingModel model; private javax.swing.JTextField firstName; private javax.swing.JTextField lastName; private SavePersonAction savePersonAction; // hook up to JButton/JMenuItem // and getters and setters... // Create some method like init() which binds PlainDocument to JTextField // and Actions to JButtons or JMenuItems }

Veo que algunas personas no están de acuerdo con la extensión de JFrame o JPanel. Yo no. Funciona para mi.

Además, use LayoutManagers. GridBagLayout es muy poderoso. Si lo usa, defina algunas constantes GridBagConstraints (como LABEL_GBC y FIELD_GBC) y continúe reutilizándolas.


Intenta no codificar el texto en tu aplicación. Las guiones de Swing pueden escribirse fácilmente para que sean controladas por datos, considere definir su GUI en un archivo xml (incluidos los nombres de los componentes y los atributos de posición / diseño).

Trabajé en sistemas que tenían MUCHAS hojas de propiedad (que son solo montones de controles, página tras página de ellas); sin hacerlo impulsado por datos, es prácticamente imposible de mantener o internacionalizar.

Si decide utilizar un constructor de GUI, nunca modifique el código que genera si es posible evitarlo, es mejor vincularse a la GUI desde una clase externa. Piense en lo que sucederá si tiene que hacerlo sin el constructor: ¿será difícil trasladarlo? ¿Imposible?

Comprenda los errores en el swing, solo modificando los componentes de GUI del subproceso AWT, devolviendo el subproceso AWT lo más rápido posible (genere un nuevo subproceso si tiene que hacer algo que ocupe más de 100 ms),

Haga todo lo posible para mantener su código SECO - Puede ser un desafío de programación real con GUI Swing - De nuevo, el código controlado por datos es la única forma en que he encontrado para no repetir código constantemente como el nuevo JButton ("...") ;

Si sus datos están basados ​​en hojas de propiedades, considere seriamente crear un mecanismo de enlace para vincular sus controles a sus datos. Un buen objetivo para el código DRY sería 0 (CERO) líneas de código específicas del control por control para obtener un fragmento de datos de su base de datos a su GUI, haga que el usuario lo edite y lo devuelva a su base de datos. Esto significa que debe poder agregar un nuevo control al no hacer nada más que modificar sus datos.


Nunca se deriva de JDialog, JFrame o JInternalFrame para definir sus formularios, diálogos ...

Rather deriva de JPanel. Esto le traerá las siguientes ventajas:

  • posibilidad de cambiar más tarde de un JFrame a un JDialog por ejemplo (porque el usuario cambió de opinión)
  • puede reutilizar una instancia de panel de un JDialog a otro (JDialog generalmente no son reutilizables porque están construidos con una referencia a su "padre", un marco u otro cuadro de diálogo)
  • más adelante, puede cambiar el reemplazo de JDialog por una subclase más funcional de un marco de terceros.

Se supone que no debes extender las clases JFrame, JDialog, JPanel, JButton, Janything (aunque ciertas extensiones del comportamiento de la tabla solo están disponibles si lo extiendes). Puede extender JComponent si desea hacer un componente personalizado. Si se supone que implementan modelos (por ejemplo, extendiendo modelos abstractos), oyentes (por ejemplo, ampliando adaptadores), pero eso es todo. No necesita / tiene que extender los componentes de oscilación por lo general, y es mejor que no lo haga, ya que hace que su código esté ligado a la implementación de la superclase.


Usa los administradores de diseño. Quizás piense que es más sencillo simplemente posicionar todo con posiciones codificadas ahora (especialmente si usa una herramienta de diseño gráfico), pero cuando llega el momento de actualizar la interfaz gráfica o internacionalizarla, sus sucesores lo odiarán. (Créanme en esto, yo era el tipo que decía usar los administradores de diseño desde el principio, y el sucesor del tipo que me ignoró).


mvc es tu amigo.


  • Los JGoodies de Karsten Lentzsch me han sido muy útiles para el diseño arquitectónico, especialmente con respecto al patrón del modelo de presentación, los enlaces y la validación. Echa un vistazo a sus articles y libraries .
  • Use un patrón similar a MVC. Digo "me gusta" porque el objetivo es realmente separar la vista del modelo, no conformarme a un sabor específico de MVC. Prefiero usar Presentation Model yo mismo.
  • MiGLayout : lo uso para todo, a menos que lo haga un administrador de diseño básico.
  • Modular y reutilizar todo lo que pueda.
  • WindowBuilder Pro for Eclipse: el mejor diseñador visual porque funciona con código existente / editado y no lo bloquea. ¡Y ahora es gratis! No tengo problemas con el uso de diseñadores, porque la vista debe estar separada del resto del código.
  • Plataforma Netbeans (RCP): el único marco Swing real. Espero aprender y usar esto cuando tenga tiempo, porque parte del trabajo de un framework es abordar inquietudes como la tuya.
  • JavaBuilders : proyecto genial que permite JavaBuilders declarativas, pero no estoy seguro de que sea lo suficientemente maduro como para arriesgarlo, especialmente con un proyecto existente. Sin embargo, es interesante leer su libro en PDF solo para comprender los problemas que están tratando de resolver.