2008-11-19 12 views
5

Tengo una GUI "gorda" que se está volviendo bastante compleja, y me gustaría agregar enlaces de un lugar a otro, y agregar botones atrás/adelante para facilitar la navegación. Me parece que esto sería más fácil si mi aplicación fuera direccionable: cada compuesto podría tener su URI, y los enlaces usarían ese URI.¿Cómo se puede direccionar una GUI Swing/JFace/SWT?

¿Existen patrones de diseño aplicables a este problema?

Solo podía ver el código fuente de Firefox o Eclipse, pero estos son proyectos enormes y tomaría bastante tiempo darle sentido, así que lo estoy preguntando aquí. ¿Hay algún ejemplo más simple en alguna parte?

Por supuesto, sería más simple si tuviera que crear una aplicación web en primer lugar, pero no voy a volver a escribir esta enorme aplicación desde el principio.

+0

Todas las respuestas hasta la fecha suponen que hay un nivel, pero imagina un menú superior que conduce a "páginas", luego cada página tiene carpetas de pestañas anidadas. El URI necesita identificar cada página y elemento de pestaña. –

Respuesta

0

En Swing, puede usar CardLayout. Puede hacer que cada "página" sea una tarjeta, y el nombre de la tarjeta (elegido al agregar tarjetas al diseño) sería equivalente al URI que desea.

Ejemplo:

String PAGE_1_KEY = "page 1"; 
String PAGE_2_KEY = "page 2"; 
// as many keys as you need 

JFrame frame = ...; 
frame.setLayout(new CardLayout()); 
frame.add(createPage1(), PAGE_1_KEY); 
frame.add(createPage2(), PAGE_2_KEY); 
// etc. 

Luego, en sus botones oyentes de acción, que llamarían

((CardLayout)frame.getLayout()).show(frame, PAGE_1_KEY); // or whichever 
1

Mi solución para hacer cosas como esta generalmente implica el listener pattern. En pocas palabras, reduce el acoplamiento al proporcionar una forma de enviar y recibir eventos hacia y desde las partes interesadas (compuestos en este caso). Esto es bastante fácil de implementar, incluso cuando se realiza la retroadaptación. De esta forma, sus eventos y fiestas pueden cambiar sin cambiar el código dependiente.

1

Puede crear un registro "global" que asigne identificadores únicos a objetos (o quizás nombres de clase). Estos objetos podrían ser JPanels, por ejemplo. Cuando el usuario hace clic en un enlace o botón, se notifica a algún controlador con la clave de la nueva página que se mostrará. Este controlador podría crear ese JPanel y colocarlo en el marco de la aplicación.

1

Mi último enfoque incluye gerente y registro de enlaces global. Cada parte de UI pudo nombrarse a sí misma de manera única y registrarse. El gerente global conoce cada uno de ellos y luego utiliza algunos trabajos sucios para hacer que esta parte sea visible. La navegación hacia atrás/adelante fue realizada por un administrador especial de deshacer/rehacer. Cada "pantalla" pudo obtener el administrador de navegación y registrar su evento de "deshacer". Fue un trabajo duro para que funcione, pero la función resultante fue bastante útil. Hablamos sobre el uso de un servicio JNDI simple para ubicar y nombrar las piezas de UI. También puede ser útil para vincular.

Cuestiones relacionadas