El uso de múltiples JFrames: ¿buena o mala práctica? [cerrado]

Mar 04 2012

Estoy desarrollando una aplicación que muestra imágenes y reproduce sonidos de una base de datos. Estoy tratando de decidir si usar o no un JFrame separado para agregar imágenes a la base de datos desde la GUI.

Me pregunto si es una buena práctica utilizar varias ventanas JFrame.

Respuestas

456 AndrewThompson Mar 04 2012 at 18:56

Me pregunto si es una buena práctica utilizar varios JFrames.

Mala (mala, mala) práctica.

  • No amigable para el usuario: el usuario ve varios íconos en su barra de tareas cuando espera ver solo uno. Además de los efectos secundarios de los problemas de codificación.
  • Una pesadilla para codificar y mantener:
    • Un cuadro de diálogo modal ofrece la fácil oportunidad de centrar la atención en el contenido de ese cuadro de diálogo: elija / corrija / cancele esto y luego continúe. Varios fotogramas no lo hacen.
    • Un diálogo (o barra de herramientas flotante) con un padre aparecerá al frente cuando se haga clic en el padre; tendrías que implementar eso en marcos si ese fuera el comportamiento deseado.

Hay varias formas de mostrar muchos elementos en una GUI, por ejemplo:

  • CardLayout( demostración corta ). Bueno para:
    1. Mostrando diálogos similares a asistentes.
    2. Visualización de selecciones de lista, árbol, etc. para elementos que tienen un componente asociado.
    3. Pasando entre ningún componente y componente visible.
  • JInternalFrame/JDesktopPane se utiliza normalmente para un MDI .
  • JTabbedPane para grupos de componentes.
  • JSplitPane Una forma de visualizar dos componentes cuya importancia entre uno u otro (el tamaño) varía según lo que esté haciendo el usuario.
  • JLayeredPane muchos componentes bien en capas.
  • JToolBarnormalmente contiene grupos de acciones o controles. Se puede arrastrar por la GUI o desactivarla por completo según las necesidades del usuario. Como se mencionó anteriormente, minimizará / restaurará de acuerdo con el padre que lo haga.
  • Como elementos en un JList(ejemplo simple a continuación).
  • Como nodos en a JTree.
  • Diseños anidados .

Pero si esas estrategias no funcionan para un caso de uso particular, intente lo siguiente. Establecer un único principal JFrame, a continuación, tienen JDialogo JOptionPaneinstancias aparecen para el resto de los elementos que flotan libremente, utilizando el marco como el padre de los cuadros de diálogo.

Muchas imágenes

En este caso, donde los elementos múltiples son imágenes, sería mejor usar cualquiera de los siguientes en su lugar:

  1. Una única JLabel(centrada en un panel de desplazamiento) para mostrar cualquier imagen que le interese al usuario en ese momento. Como se ve en ImageViewer.
  2. Una sola fila JList. Como se ve en esta respuesta . La parte de 'una sola fila' solo funciona si todas tienen las mismas dimensiones. Alternativamente, si está preparado para escalar las imágenes sobre la marcha, y todas tienen la misma relación de aspecto (por ejemplo, 4: 3 o 16: 9).

205 ryvantage Jul 31 2013 at 10:33

El JFrameenfoque múltiple ha sido algo que he implementado desde que comencé a programar aplicaciones Swing. En su mayor parte, lo hice al principio porque no sabía nada mejor. Sin embargo , a medida que maduré en mi experiencia y conocimientos como desarrollador y comencé a leer y absorber las opiniones de tantos desarrolladores de Java con más experiencia en línea, intenté alejarme del JFrameenfoque múltiple (tanto en proyectos actuales como en proyectos futuros). ) solo para encontrarme con ... obtener esta ... resistencia de mis clientes! Cuando comencé a implementar diálogos modales para controlar ventanas "secundarias" ys JInternalFramepara componentes separados, ¡ mis clientes comenzaron a quejarse! ¡Estaba bastante sorprendido, ya que estaba haciendo lo que pensé que era la mejor práctica! Pero, como dicen, "una esposa feliz es una vida feliz". Lo mismo ocurre con sus clientes. Por supuesto, soy un contratista, por lo que mis usuarios finales tienen acceso directo a mí, el desarrollador, lo que obviamente no es un escenario común.

Por lo tanto, voy a explicar los beneficios del JFrameenfoque múltiple , así como a desmentir algunos de los contras que otros han presentado.

  1. Máxima flexibilidad en el diseño : al permitir mensajes de JFramecorreo electrónico separados , le brinda a su usuario final la capacidad de distribuir y controlar lo que está en su pantalla. El concepto se siente "abierto" y no restrictivo. Pierdes esto cuando vas hacia uno grande JFramey un montón de JInternalFrames.
  2. Funciona bien para aplicaciones muy modularizadas - En mi caso, la mayoría de mis aplicaciones tienen de 3 a 5 "módulos" grandes que realmente no tienen nada que ver entre sí en absoluto. Por ejemplo, un módulo podría ser un panel de ventas y otro podría ser un panel de contabilidad. No se hablan ni nada. Sin embargo, es posible que el ejecutivo quiera abrir ambos y que sean marcos separados en la barra de tareas le facilita la vida.
  3. Hace que sea fácil para los usuarios finales hacer referencia a material externo - Una vez, tuve esta situación: Mi aplicación tenía un "visor de datos", desde el cual se podía hacer clic en "Agregar nuevo" y se abría una pantalla de ingreso de datos. Inicialmente, ambos fueron del JFrames. Sin embargo, quería que la pantalla de entrada de datos fuera un JDialogpadre cuyo padre era el visor de datos. Hice el cambio e inmediatamente recibí una llamada de un usuario final que confiaba en gran medida en el hecho de que podía minimizar o cerrar el visor y mantener el editor abierto mientras hacía referencia a otra parte del programa (o un sitio web, no no recuerdo). Es no en un multi-monitor, por lo que necesitaba el diálogo de entrada a ser el primero y algo más para estar en segundo lugar, con los datos Visor completamente ocultos. Esto era imposible con a JDialogy ciertamente habría sido imposible con a JInternalFrametambién. A regañadientes lo cambié de nuevo a estar separado JFramespor su cordura, pero me enseñó una lección importante.
  4. Mito: Difícil de codificar : esto no es cierto en mi experiencia. No veo por qué sería más fácil crear un JInternalFramearchivo JFrame. De hecho, según mi experiencia, JInternalFramesofrecen mucha menos flexibilidad. He desarrollado una forma sistemática de manejar la apertura y el cierre de JFrames en mis aplicaciones que realmente funciona bien. Control el marco casi por completo desde el propio código del marco; la creación de nuevos marcos, SwingWorkerque controlan la recuperación de datos en subprocesos en segundo plano y el código GUI en EDT, restaurar / traer al frente el marco si el usuario intenta abrirlo dos veces, etc. Todo lo que necesita para abrir mi JFrames es llamar a un método estático público open()y el método abierto, combinado con un windowClosing()evento maneja el resto (¿el marco ya está abierto? ¿No está abierto, pero se está cargando? etc.) Hice de este enfoque una plantilla para que no sea difícil de implementar para cada marco .
  5. Mito / no probado: recursos abundantes: me gustaría ver algunos hechos detrás de esta declaración especulativa. Aunque, quizás, podría decir que a JFramenecesita más espacio que a JInternalFrame, incluso si abre 100 JFrames, ¿cuántos recursos más consumiría realmente? Si su preocupación son las pérdidas de memoria debido a los recursos: la llamada dispose()libera todos los recursos utilizados por el marco para la recolección de basura (y, de nuevo digo, JInternalFramedebería invocar exactamente la misma preocupación).

He escrito mucho y siento que podría escribir más. De todos modos, espero no ser rechazado simplemente porque es una opinión impopular. La pregunta es claramente valiosa y espero haber brindado una respuesta valiosa, incluso si no es la opinión común.

Un gran ejemplo de fotogramas múltiples / documento único por fotograma ( SDI ) frente a fotograma único / documentos múltiples por fotograma ( MDI ) es Microsoft Excel. Algunos de los beneficios de MDI:

  • es posible tener algunas ventanas en forma no rectangular, para que no oculten el escritorio u otra ventana de otro proceso (por ejemplo, navegador web)
  • es posible abrir una ventana de otro proceso en una ventana de Excel mientras se escribe en la segunda ventana de Excel; con MDI, intentar escribir en una de las ventanas internas dará foco a toda la ventana de Excel, por lo que se ocultará la ventana de otro proceso
  • es posible tener diferentes documentos en diferentes pantallas, lo cual es especialmente útil cuando las pantallas no tienen la misma resolución

SDI (interfaz de documento único, es decir, cada ventana solo puede tener un documento):

MDI (Interfaz de varios documentos, es decir, cada ventana puede tener varios documentos):

53 DuncanKinnear Aug 30 2013 at 10:36

Me gustaría contrarrestar el argumento de que "no es fácil de usar" con un ejemplo en el que acabo de participar.

En nuestra aplicación tenemos una ventana principal donde los usuarios ejecutan varios 'programas' como pestañas separadas. En la medida de lo posible, hemos intentado mantener nuestra aplicación en esta única ventana.

Uno de los 'programas' que ejecutan presenta una lista de informes que han sido generados por el sistema, y ​​el usuario puede hacer clic en un icono en cada línea para abrir un cuadro de diálogo del visor de informes. Este visor muestra el equivalente a la (s) página (s) A4 vertical / horizontal del informe, por lo que a los usuarios les gusta que esta ventana sea bastante grande, casi llenando sus pantallas.

Hace unos meses comenzamos a recibir solicitudes de nuestros clientes para que estas ventanas del visor de informes no tuvieran modo, de modo que pudieran tener varios informes abiertos al mismo tiempo.

Durante algún tiempo me resistí a esta solicitud porque no creía que fuera una buena solución. Sin embargo, mi mente cambió cuando descubrí cómo los usuarios estaban solucionando esta "deficiencia" de nuestro sistema.

Abrían un visor, usaban la función "Guardar como" para guardar el informe como PDF en un directorio específico, usaban Acrobat Reader para abrir el archivo PDF y luego hacían lo mismo con el siguiente informe. Tendrían varios Acrobat Reader ejecutándose con las distintas salidas de informes que querían ver.

Así que cedí y dejé al espectador sin modelo. Esto significa que cada visor tiene un icono en la barra de tareas.

Cuando se les lanzó la última versión la semana pasada, la respuesta abrumadora de ellos es que les ENCANTA. Ha sido una de nuestras mejoras recientes más populares en el sistema.

Así que sigue adelante y les dices a tus usuarios que lo que quieren es malo, pero que al final no te hará ningún favor.

ALGUNAS NOTAS:

  • Parece ser una buena práctica usar JDialog's para estas ventanas sin modo
  • Utilice los constructores que utilizan el argumento new en ModalityTypelugar del booleano modal. Esto es lo que le da a estos cuadros de diálogo el icono de la barra de tareas.
  • Para los diálogos no modales, pase un padre nulo al constructor, pero ubíquelos en relación con su ventana 'padre'.
  • La versión 6 de Java en Windows tiene un error que significa que su ventana principal puede estar "siempre en la parte superior" sin que usted se lo diga. Actualice a la versión 7 para solucionar este problema
20 VirendraSinghRathore Oct 17 2012 at 12:25

Convierta un jInternalFrame en el marco principal y hágalo invisible. Entonces puedes usarlo para más eventos.

jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);
19 Necronet Mar 05 2013 at 07:55

Ha pasado un tiempo desde la última vez que toqué el swing, pero en general es una mala práctica hacer esto. Algunas de las principales desventajas que me vienen a la mente:

  • Es más caro: tendrá que asignar muchos más recursos para dibujar un JFrame que otro tipo de contenedor de ventana, como Dialog o JInternalFrame.

  • No es fácil de usar: no es fácil navegar en un grupo de JFrame pegados, parecerá que su aplicación es un conjunto de aplicaciones inconsistentes y mal diseñadas.

  • Es fácil de usar JInternalFrame Esto es un poco retórico, ahora es mucho más fácil y otras personas más inteligentes (o con más tiempo libre) que nosotros ya han pensado en el patrón Desktop y JInternalFrame, por lo que recomendaría usarlo.

10 MattDawsey Jan 10 2013 at 17:37

Definitivamente mala práctica. Una razón es que no es muy "fácil de usar" por el hecho de que cada uno JFramemuestra un nuevo icono en la barra de tareas. Controlar varios JFrames hará que te arranques el pelo.

Personalmente, usaría ONE JFramepara su tipo de aplicación. Los métodos para mostrar varias cosas dependen de usted, hay muchos. CanvasES, JInternalFrame, CardLayout, incluso JPanels posiblemente.

Múltiples objetos JFrame = Dolor, problemas y problemas.

8 Lijo Dec 18 2013 at 14:03

Creo que usar múltiples Jframes no es una buena idea.

En su lugar, podemos usar JPanels más de uno o más JPanelen el mismo JFrame.

También podemos cambiar entre este JPanels. Por lo tanto, nos da libertad para mostrar más cosas en el JFrame.

Para cada uno JPanelpodemos diseñar cosas diferentes y todo esto JPanelse puede mostrar en JFrameuno a la vez.

Para alternar entre este JPanels uso JMenuBarcon JMenuItemscada JPanelo 'JButton for eachJPanel`.

Más de uno JFrameno es una buena práctica, pero no hay nada de malo si queremos más de uno JFrame.

Pero es mejor cambiar uno JFramepara nuestras diferentes necesidades en lugar de tener varios JFrames.

5 KeithSpriggs Sep 04 2013 at 05:25

Si los marcos van a tener el mismo tamaño, ¿por qué no crear el marco y pasar el marco como referencia?

Cuando haya pasado el marco, podrá decidir cómo rellenarlo. Sería como tener un método para calcular el promedio de un conjunto de cifras. ¿Crearías el método una y otra vez?

5 arunjoseph Dec 14 2013 at 20:20

No es una buena práctica, pero aunque desee usarlo, puede usar el patrón singleton como bueno. He usado los patrones singleton en la mayor parte de mi proyecto, es bueno.