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
/JDesktopPane
típicamente usado para un MDI .JTabbedPane
para grupos de componentes.JSplitPane
Una forma de mostrar 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.JToolBar
normalmente 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 aparezcanJDialog
oJOptionPane
instancias 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
JFrame
antes y nunca había considerado esos problemas, ¡gracias por explicarlo!El
JFrame
enfoque 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 delJFrame
enfoque 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 secundariosJInternalFrame
para 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
JFrame
enfoque 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 grandeJFrame
y un montón deJInternalFrame
s.JFrame
s. Sin embargo, quería que la pantalla de entrada de datos fuera unJDialog
cuyo 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 unJDialog
y ciertamente habría sido imposible con unJInternalFrame
también. A regañadientes lo cambié a estar separadoJFrames
por su cordura, pero me enseñó una lección importante.JInternalFrame
que aJFrame
. De hecho, en mi experiencia,JInternalFrames
ofrecen mucha menos flexibilidad. He desarrollado una forma sistemática de manejar la apertura y cierre deJFrame
s 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 marcosSwingWorker
que 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 miJFrame
s 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.JFrame
necesita más espacio que aJInternalFrame
, incluso si abre 100JFrame
s, ¿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,JInternalFrame
deberí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
JFrame
y 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éJInternalFrame
un 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.JFrame
tiene 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.JDialog
sobre 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:
ModalityType
lugar delmodal
argumento 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!CardLayout
es una verdadera bendición!JInternalFrame
no ofrece ventajas en ninguno de los tres casos que mencionó (1. ¿Dónde está la evidencia queJInternalFrame
es más ligera queJFrame
? 2. SuJInternalFrame
s podría ser tan desordenado / desordenado / pegado como un montón deJFrame
s. 3. ¿Cómo esJInternalFrame
más fácil? Es el mismo código exacto, excepto que uno está contenido dentro deJDesktopPane
JComponent
s, ambos tienen estructuras casi idénticas, excepto que uno se representa en ayJDesktop
uno 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"JInternalFrame
s 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
JFrame
muestra un nuevo icono de barra de tareas. Controlar múltiplesJFrame
s te hará arrancarte el pelo.Personalmente, usaría ONE
JFrame
para su tipo de aplicación. Los métodos para mostrar varias cosas dependen de usted, hay muchos.Canvas
ES,JInternalFrame
,CardLayout
, inclusoJPanel
s posiblemente.Múltiples objetos JFrame = Dolor, problemas y problemas.
fuente
Creo que usar múltiples
Jframe
s no es una buena idea.En cambio, podemos usar
JPanel
s más de uno o másJPanel
en el mismoJFrame
.También podemos cambiar entre este
JPanel
s. Por lo tanto, nos da libertad para mostrar más de lo que hay en elJFrame
.Para cada uno
JPanel
podemos diseñar cosas diferentes y todo estoJPanel
se puede mostrar enJFrame
una sola a la vez.Para cambiar entre esto
JPanel
, useJMenuBar
conJMenuItems
cadaJPanel
o 'JButtonfor each
JPanel`.Más de uno
JFrame
no es una buena práctica, pero no hay nada de malo si queremos más de unoJFrame
.Pero es mejor cambiar uno
JFrame
para nuestras diferentes necesidades en lugar de tener múltiplesJFrame
s.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