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 usar múltiples ventanas JFrame.
java
swing
user-interface
jframe
Vendedor ambulante
fuente
fuente

Respuestas:
Mala (mala, mala) práctica.
Hay muchas formas de mostrar muchos elementos en una GUI, por ejemplo:
CardLayout(breve demostración ). Bueno para:JInternalFrame/JDesktopPanetípicamente usado para un MDI .JTabbedPanepara grupos de componentes.JSplitPaneUna forma de mostrar dos componentes cuya importancia entre uno u otro (el tamaño) varía según lo que esté haciendo el usuario.JLayeredPanemuchos componentes bien en capas.JToolBarnormalmente contiene grupos de acciones o controles. Se puede arrastrar alrededor de la GUI o desactivarla por completo según las necesidades del usuario. Como se mencionó anteriormente, minimizará / restaurará según lo haga el padre.JList(ejemplo simple a continuación).JTree.Pero si esas estrategias no funcionan para un caso de uso particular, intente lo siguiente. Establezca un solo main
JFrame, luego haga que aparezcanJDialogoJOptionPaneinstancias para el resto de los elementos flotantes, utilizando el marco como padre para los diálogos.Muchas imagenes
En este caso donde los elementos múltiples son imágenes, sería mejor usar cualquiera de los siguientes:
JLabel(centrada en un panel de desplazamiento) para mostrar la imagen que le interese al usuario en ese momento. Como se ve enImageViewer.JList. Como se ve en esta respuesta . La parte de 'fila única' 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).fuente
JFrameantes y nunca había considerado esos problemas, ¡gracias por explicarlo!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 conocimiento como desarrollador y cuando comencé a leer y absorber las opiniones de muchos desarrolladores Java más experimentados en línea, intenté alejarme delJFrameenfoque múltiple (tanto en proyectos actuales como en proyectos futuros). ) solo para encontrarme con ... obtener esto ... ¡ resistencia de mis clientes! Cuando comencé a implementar diálogos modales para controlar ventanas y elementos secundariosJInternalFramepara componentes separados, ¡ mis clientes comenzaron a quejarse!¡Estaba bastante sorprendido, ya que estaba haciendo lo que creía que era la mejor práctica! Pero, como dicen, "una esposa feliz es una vida feliz". Lo mismo va para tus 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 revelar algunos de los inconvenientes que otros han presentado.JFrame, le brinda a su usuario final la capacidad de expandirse y controlar lo que está en su pantalla. El concepto se siente "abierto" y no restrictivo. Pierdes esto cuando vas hacia uno grandeJFramey un montón deJInternalFrames.JFrames. Sin embargo, quería que la pantalla de entrada de datos fuera unJDialogcuyo padre era el visor de datos. Realicé 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 lo hago). No recuerdo). Es no en un multi-monitor, por lo que necesitaba el diálogo de entrada a ser el primero y algo másser segundo, con el visor de datos completamente oculto. Esto era imposible con unJDialogy ciertamente habría sido imposible con unJInternalFrametambién. A regañadientes lo cambié a estar separadoJFramespor su cordura, pero me enseñó una lección importante.JInternalFrameque aJFrame. De hecho, en mi experiencia,JInternalFramesofrecen mucha menos flexibilidad. He desarrollado una forma sistemática de manejar la apertura y cierre deJFrames en mis aplicaciones que realmente funciona bien. Yo controlo el cuadro casi por completo desde el propio código del cuadro; la creación de los nuevos marcosSwingWorkerque controlan la recuperación de datos en subprocesos en segundo plano y el código GUI en EDT, restaurando / trayendo al frente el marco si el usuario intenta abrirlo dos veces, etc. Todo lo que necesita para abrir miJFrames es llamar a un método público estáticoopen()y al método abierto, combinado con unwindowClosing()El evento maneja el resto (¿el marco ya está abierto? ¿No está abierto, pero cargando? etc.) Hice este enfoque una plantilla para que no sea difícil de implementar para cada marco.JFramenecesita más espacio que aJInternalFrame, incluso si abre 100JFrames, ¿cuántos recursos más estaría realmente consumiendo? Si su preocupación son las pérdidas de memoria debido a los recursos: la llamadadispose()libera todos los recursos utilizados por el marco para la recolección de basura (y, nuevamente, 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 proporcionado una respuesta valiosa, incluso si no es la opinión común.
Un excelente ejemplo de varios cuadros / documento único por cuadro ( SDI ) frente a un solo cuadro / documentos múltiples por cuadro ( MDI ) es Microsoft Excel. Algunos de los beneficios de MDI:
SDI (interfaz de documento único, es decir, cada ventana solo puede tener un documento único):
MDI (Interfaz de documentos múltiples, es decir, cada ventana puede tener múltiples documentos):
fuente
JFramey un gran padreJTabbedPane; pero con la posibilidad de abrir una segunda ventana (o incluso más) donde el diseño puede ser diferente, ofreciendo así un comportamiento híbrido donde los amantes de SDI son felices y también los de MDI. En todos los casos, siempre lo consideréJInternalFrameun patrón horrible que te brinda todos los inconvenientes de ambos mundos. La flexibilidad que ofrecen simplemente apesta y consumen una gran cantidad de valioso espacio en la pantalla sin ningún propósito real.JFrametiene su propio icono de barra de tareas. A veces esto es exactamente lo que quieres, pero a veces no lo es. En WinAPI esto es fácil de configurar, pero en Swing parece que no se puede hacer.JDialogsobre aJFrame.Me gustaría contrarrestar el argumento "no fácil de usar" con un ejemplo en el que acabo de involucrarme.
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 tratado de mantener nuestra aplicación en esta única ventana.
Uno de los 'programas' que ejecutan presenta una lista de informes generados por el sistema, y el usuario puede hacer clic en un icono en cada línea para abrir un cuadro de diálogo de visor de informes. Este visor muestra el equivalente de las páginas A4 verticales / horizontales 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 hacer que estas ventanas de visor de informes no fueran modales, para que pudieran tener múltiples informes abiertos al mismo tiempo.
Durante algún tiempo me resistí a esta solicitud, ya que no creía que fuera una buena solución. Sin embargo, mi opinión cambió cuando descubrí cómo los usuarios estaban evitando esta 'deficiencia' de nuestro sistema.
Estaban abriendo un visor, usando la función 'Guardar como' para guardar el informe como PDF en un directorio específico, usando Acrobat Reader para abrir el archivo PDF, y luego harían lo mismo con el siguiente informe. Tendrían múltiples lectores de Acrobat ejecutándose con los diversos resultados de informes que querían ver.
Entonces cedí e hice que el espectador no tuviera modo. Esto significa que cada visor tiene un icono de 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 del sistema.
Así que sigue adelante y dile a tus usuarios que lo que quieren es malo, pero que en última instancia no te hará ningún favor.
ALGUNAS NOTAS:
ModalityTypelugar delmodalargumento booleano . Esto es lo que le da a estos cuadros de diálogo el icono de la barra de tareas.fuente
Haga un jInternalFrame en el marco principal y hágalo invisible. Entonces puedes usarlo para más eventos.
fuente
Ha pasado un tiempo desde la última vez que toco swing, pero en general es una mala práctica hacer esto. Algunas de las principales desventajas que vienen a la mente:
Es más costoso: 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 montón de JFrame unidos, 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 retorcido, ahora es mucho más fácil y otras personas más inteligentes (o con más tiempo libre) de lo que ya hemos pensado en el escritorio y el patrón JInternalFrame, por lo que recomendaría usarlo.
fuente
JInternalFrame's también? Personalmente, no estoy de acuerdo con el uso deJInternalFrame's!CardLayoutes una verdadera bendición!JInternalFrameno ofrece ventajas en ninguno de los tres casos que mencionó (1. ¿Dónde está la evidencia queJInternalFramees más ligera queJFrame? 2. SuJInternalFrames podría ser tan desordenado / desordenado / pegado como un montón deJFrames. 3. ¿Cómo esJInternalFramemás fácil? Es el mismo código exacto, excepto que uno está contenido dentro deJDesktopPaneJComponents, ambos tienen estructuras casi idénticas, excepto que uno se representa en ayJDesktopuno no. Una vez más, lo siento, pero creo que especula sobre el "peso" deJFrame. 2. Mis aplicaciones usan SDI y mis clientes están muy contentos. Sin embargo, dijiste "un montón de ventanas", lo cual, por supuesto, sería una mierda. Pero, mi punto es este: "¡una tonelada de"JInternalFrames apestaría igual de mal! Si estás diciendo que los JIF te permiten ser un diseñador de interfaz de usuario descuidado, entonces eso es terrible. Un desorden desordenado es un desorden desordenado, ya sea JF o JIF.Mala práctica definitivamente. Una razón es que no es muy fácil de usar por el hecho de que cada uno
JFramemuestra un nuevo icono de barra de tareas. Controlar múltiplesJFrames te hará arrancarte 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, inclusoJPanels posiblemente.Múltiples objetos JFrame = Dolor, problemas y problemas.
fuente
Creo que usar múltiples
Jframes no es una buena idea.En cambio, podemos usar
JPanels más de uno o másJPanelen el mismoJFrame.También podemos cambiar entre este
JPanels. Por lo tanto, nos da libertad para mostrar más de lo que hay en elJFrame.Para cada uno
JPanelpodemos diseñar cosas diferentes y todo estoJPanelse puede mostrar enJFrameuna sola a la vez.Para cambiar entre esto
JPanel, useJMenuBarconJMenuItemscadaJPanelo 'JButtonfor eachJPanel`.Más de uno
JFrameno es una buena práctica, pero no hay nada de malo si queremos más de unoJFrame.Pero es mejor cambiar uno
JFramepara nuestras diferentes necesidades en lugar de tener múltiplesJFrames.fuente
Si los marcos van a ser del mismo tamaño, ¿por qué no crear el marco y pasar el marco como referencia en su lugar?
Cuando haya pasado el marco, puede decidir cómo llenarlo. 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?
fuente
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ía de mi proyecto, es bueno.
fuente