Aplicacion de escritorio (MDI) ayuda...!!
Les agradesco todos sus respues... que han echo hasta ahorita
Nomas para confirmar... la pregunta...
a lo mejor nuca llegaron a entender lo que realmente quiero hacer.. a lo mejor es algo sencillo de configuración pero yo no puedo solucionarlo..
debido a que este hice lo siguiente,
**---- formulario principal JFrame(MDI)
---- de aqui desprendes los catalogos etc que son formularios
**--- JInternalFrame
desde la ventanas JInternalFrame mando a llamar el catalogo correspondiente de acuerdo a la opción seleccionada, puede ser, catalogo de áreas, empleados, asignaciones, movimientos etc. estos catalos correspondientes son de tipo JPanel la cual contiene
los botones actualizar, eliminar, nuevo, buscar etc y un JTable donde se muestra todo lo registrado etc.
hasta aqui todo bien de maravilla no tengo broncas.... puedo minimizar la aplicacion
-----------------------------------------------------------------------------------------------------------------------
cada botón, nuevo, o actualizar manda a llamar la ventana tipo modal
**--- JDialog que contiene cajas de texto, combobox, boton guardar cancelar etc.
aquí es donde viene el problema porque teniendo abierto esta ventana tipo modal
quiero acceder hasta el formulario principal MDI, no realmente acceder no quiero acceder a los menús, lo realmente deseo hacer es que me permita minimizar la ventana principal, o se en pocas palabras minimizar la aplicación...
en linux no hay problema porque si lo hace.. no se a que se debe pero si lo hace sin hacer configuraciones....
el problema bien en windows porque ahi no permite acceder hasta la principal para minimizar la aplicación.-
----------------------------------------------------------------------------------------------------------------------
descartando el uso de ventana JDialog...
oara usando un
***---- JOptionPane.showInternalOptionDialog()
--lo que hice fue poner todo el contenido del jdialog las cajas de texto, botones, combobox, ponerlo en un JPanel,
ahora cuando presiono el botón de nuevo o actualizar, ahora mando a llamar el JPanel
la cual la muestro en un JOptionPane.showInternalOptionDialog() quedado de la siguiente forma,
llama.titulo("Nueva Asignación");
JOptionPane.showInternalOptionDialog(this, llama, "Nueva Asignación",JOptionPane.DEFAULT_OPTION,
JOptionPane.DEFAULT_OPTION, null, new Object[]{},null);
como es un mensaje de dialogo interno .. ahora si puedo minimizar la aplicacion principal
no hay bronca.... pero como todo siempre hay algo que no nos gusta..
-------------------------------------------------------------------------------------------------------------------------
al mostrar el JPanel en un JOptionPane.showInternalDialog, esto jenera un marco la
cual deja un espacio alrrededor de jpanel y eso no me gusta...
aver si alquien de ustedes puede orientarme este pequeño diseño....
de echo ahorita voy a actualizar el tema donde subo una pantalla mas de lo que estoy hablando
Adjunto | Tamaño |
---|---|
Pantalla.png | 98.73 KB |
pantalla2.png | 58.98 KB |
Captura de pantalla de 2015-03-16 12:28:11.png | 236.14 KB |
show internal1.png | 258.84 KB |
show internal2.png | 246.8 KB |
- Inicie sesión o regístrese para enviar comentarios
Re: minimizar
¿Y por qué alguien querría hacer algo como eso? Bueno, cada quien. Respecto al asunto de minimizar (1):
Notas
~~~
porque alguien quiere hacer eso
Porque el que es mi asesor del proyecto.. bueno para mi titulacion.. me pide eseo, y igual donde lo van a utulizar lo requieren que sea asi..
no cres que es por mi gusto
uuu no lo puede ser
No puede ser que nadie responda... es que no me explico bien..
¡Ja!
Y yo que pensé que ya estaba solucionado.
aun-no
Aun no he solucionado... help
Ejemplo con ponis
He aquí un pequeño ejemplo:
final JFrame frame = new JFrame("A pony");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton button = new JButton("Saddle the pony");
button.setFont(new Font("Arial", Font.BOLD, 30));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
JOptionPane.showMessageDialog(frame, "What? Rebel pony!");
frame.setVisible(true);
}
});
frame.add(button);
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
¡Por si sirve de algo!
~~~
grax
pero no me sirve.. sigo sin obtener el resultado deseadooo
Re: «grax»
¿Y qué es exactamente lo que deseas? ¿Qué resultado obtienes? ¿Crees que puedas re-escribir tu pregunta? Tal vez quieras ver Cómo hacer que tus preguntas tengan más posibilidades de ser respondidas.
Re: Sin resultados
El problema es que primero empiezas preguntando una cosa y luego otra y a la vez la mezclas, por lo que entendi tu problema radica en que no puedes hacer que tus JInternalFrames se comuniquen entre si es decir que se pasen datos entre ellos, bueno para eso solo tienes que cambiar el nivel de acceso de tus controles asi como se muestra en la imagen, no se con que IDE trabajes, pero en Netbeans es asi.
ouch
Buen ejemplo de un antipatrón, eso de hacer los controles
public static
. No sólo es mandar el encapsulamiento al diablo, sino también en cierta medida la orientación a objetos. Si resulta que quieres tener varias instancias de uno de esos frames, todos van a compartir el mismo control...Algo más limpio (o al menos no tan desordenado) es implementar MVC, o algo similar; cuando menos, crear una clase con los datos que se deben de pasar de una ventana a otra, para que una ventana pueda crear ese objeto y ponerle los datos necesarios y devolverlo en algún método que llama la otra ventana, la cual después toma los datos de ahí para desplegarlos.
Si nos vamos un poco más a la abstracción, para desacoplar aún más esto, pues realmente una ventana no tiene por qué saber absolutamente nada de la otra ventana. No tiene ni siquiera por qué saber que es una ventana...
Por un lado, defines los datos que debes pasar de un lado a otro, y una interfaz para obtenerlos:
private final String s1;
private final String s2;
private Datos(String s1, String s2) {
this.s1=s1;
this.s2=s2;
}
public String getS1() { return s1; }
public String getS2() { return s2; }
}
public interface ProveedorDatos {
public Datos getDatos();
}
Ahora, tu ventana puede implementar esa interfaz, y poblar ese objeto de datos con los valores de sus controles:
private JFrame v;
private JTextField tf1;
private JTextField tf2;
//y demás controles
public Ventana1() {
//Crear un JFrame, poblarlo, etc.
}
public Datos getDatos() {
return new Datos(tf1.getText(), tf2.getText());
}
}
Finalmente, tu otra ventana necesita saber de dónde sacar datos:
private final ProveedorDatos prov;
private JFrame v;
//etc los demás controles
public Ventana2(ProveedorDatos proveedor) {
prov = proveedor;
//Construir ventana y ponerle componentes
}
public void show() {
Datos datos = prov.getDatos();
//Mostrar los datos obtenidos en los controles de esta ventana
//O bien hacer cualquier otra cosa que se necesite con dichos datos
v.setVisible(true);
}
}
Re: Antipatron
No me lo había planteado de esa manera, pero tienes mucha razon @ezamudio de echo la mayoría de veces lo hago así tal y como indicas, una pregunta, si tengo una tabla y que al hacer clic en esa tabla se me despliegue un formulario con los datos de la fila seleccionada, también tendría que hacerlo con MVC? o simplemente tomo los datos ya almacenados en la tabla temporalmente?
algo como esto:
btnGuardar.setText("Editar");
habilitar();
accion = "editar";
int fila = miTabla.rowAtPoint(evt.getPoint());
txtIdProvedor.setText(tablaRecordatorios.getValueAt(fila, 0).toString());
txtTelefono.setText(tablaRecordatorios.getValueAt(fila, 1).toString());
txtDireccion.setText(tablaRecordatorios.getValueAt(fila, 2).toString());
}
otro evento?
No tienes otro evento que puedas cachar? Algo como un cambio de selección, en vez de un evento de mouse... qué pasa si en vez de click, oprimen ENTER?
Todo ese tipo de cosas que mencionan son mucho más sencillas si usas algún framework como Griffon en vez de hacer todo en Java "pelón".
Re: Antipatron
Entiendo, seria bueno que alguien hiciera un tutorial o un post, en donde aborde el tema de como diseñar una aplicación en Java, ya que hay mucha información sobre Patrones de diseño muy buenos, pero a la hora de aplicarlos o ver como encajarían en mi proyecto da algo de dificultades.
Gracias...
repregunta.--
Les agradesco todos sus respues... que han echo hasta ahorita
Nomas para confirmar... la pregunta...
a lo mejor nuca llegaron a entender lo que realmente quiero hacer.. a lo mejor es algo sencillo de configuración pero yo no puedo solucionarlo..
debido a que este hice lo siguiente,
**---- formulario principal JFrame(MDI)
---- de aqui desprendes los catalogos etc que son formularios
**--- JInternalFrame
desde la ventanas JInternalFrame mando a llamar el catalogo correspondiente de acuerdo a la opción seleccionada, puede ser, catalogo de áreas, empleados, asignaciones, movimientos etc. estos catalos correspondientes son de tipo JPanel la cual contiene
los botones actualizar, eliminar, nuevo, buscar etc y un JTable donde se muestra todo lo registrado etc.
hasta aqui todo bien de maravilla no tengo broncas.... puedo minimizar la aplicacion
-----------------------------------------------------------------------------------------------------------------------
cada botón, nuevo, o actualizar manda a llamar la ventana tipo modal
**--- JDialog que contiene cajas de texto, combobox, boton guardar cancelar etc.
aquí es donde viene el problema porque teniendo abierto esta ventana tipo modal
quiero acceder hasta el formulario principal MDI, no realmente acceder no quiero acceder a los menús, lo realmente deseo hacer es que me permita minimizar la ventana principal, o se en pocas palabras minimizar la aplicación...
en linux no hay problema porque si lo hace.. no se a que se debe pero si lo hace sin hacer configuraciones....
el problema bien en windows porque ahi no permite acceder hasta la principal para minimizar la aplicación.-
----------------------------------------------------------------------------------------------------------------------
descartando el uso de ventana JDialog...
oara usando un
***---- JOptionPane.showInternalOptionDialog()
--lo que hice fue poner todo el contenido del jdialog las cajas de texto, botones, combobox, ponerlo en un JPanel,
ahora cuando presiono el botón de nuevo o actualizar, ahora mando a llamar el JPanel
la cual la muestro en un JOptionPane.showInternalOptionDialog() quedado de la siguiente forma,
llama.titulo("Nueva Asignación");
JOptionPane.showInternalOptionDialog(this, llama, "Nueva Asignación",JOptionPane.DEFAULT_OPTION,
JOptionPane.DEFAULT_OPTION, null, new Object[]{},null);
como es un mensaje de dialogo interno .. ahora si puedo minimizar la aplicacion principal
no hay bronca.... pero como todo siempre hay algo que no nos gusta..
-------------------------------------------------------------------------------------------------------------------------
al mostrar el JPanel en un JOptionPane.showInternalDialog, esto jenera un marco la
cual deja un espacio alrrededor de jpanel y eso no me gusta...
aver si alquien de ustedes puede orientarme este pequeño diseño....
de echo ahorita voy a actualizar el tema donde subo una pantalla mas de lo que estoy hablando
Re: "aver si alquien"
Hola, Pedro. ¿Ya has probado con GlassPane y diálogos no modales? — Sólo por curiosidad... si no agregas este "requerimiento", ¿ya no podrías titularte?
como se usa el GlassPane y dialogos no modales
Buen dia jpaul, no he problado con eso de GlassPane y dailogos no modales..
de que si no agrego este requerimiento.. lo que pasa es que donde lo voy a implementar es ahi donde me piden que aplique este requerimiento.. no en el tecnologico donde estudiaba mi acesores no me piden nada, ellos dicen que esta perfecto. ellos no ven esas cosas.. nombre yo ya me hubiera titulado.. nomas que pues en la dependencia donde voy a implementar el sistemita ahi, si me lo pide.. y es donde estoy atorado.. y realmente lo quieren.. como veras los usuarios son lo que testean estas cosas, y pues uno siempre esta acostumbrado que cuando va a abrir o pasarse a otra aplicacion que ya esta abierto, como excel, word o otra aplicacion, pues siempre van en la opcion minimizar de la aplicacion avierta..
bueno tonces me hicieron esa observacion.. y realmente si lo necesito....
gracias por la respuesta... ojala pasaras un ejemplo como se usa el GlassPane con dialogos no modales.. le agradeceria mucho
Re: no me gusta
Esto se puede configurar de la siguiente manera:
¡Quién quite y te guste! :-P
P.D. Si consigo algo de tiempo, tal vez pueda poner un ejemplo con GlassPane... El mes que viene es seguro.
~~~
UIManager
En que parte ira para poder configurar la posicion.. los margenes...
Re: en qué parte
Después de cargar el L&F y antes de crear la interfaz.
Despues de L&F
Lo voy a checar haber si lo puedo echar andar.. porque si me interesa que quede bien..., si no aquí les estaré pidiendo ayuda
Poniendo antes del L&F
que tal buen día jpaul pune al inicio el código al inicio antes de cargar el L&F
quedando de la siguiente forma
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Metal".equals(info.getName())) {
//if ("Nimbus".equals(info.getName())) {
try {
UIManager.setLookAndFeel(info.getClassName());
javax.swing.UIManager.put("OptionPane.contentMargins", new javax.swing.plaf.InsetsUIResource(0, 0, 0, 0));
break;
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
System.out.println(e);
}
}
}
cuando cargo la aplicacion con el L&F de nimbus si se logra quitar el marco que deja hacia los costados tanto la de la derecha, izquierda y arriba, pero la de abajo se queda tal como estaba... con una margende 1 cm,
ahora cambiando un poco la configuracion de Resources(0,0,0,0)
dejandolo de la siguiente forma
con estas cordenadas se ve bien el contorno bien formado pero hay un inconveniente todos los demas mensajes y de dialogs se ven corridaslos margenes....
ahora cambiando de L&Fy poniendo la de Metal o Windows
javax.swing.UIManager.put("OptionPane.contentMargins", new javax.swing.plaf.InsetsUIResource(0, 0, -15, 0));
no hace ningun efecto queda como siemre con un margen hacia los lados como de 4 mlm.quien save a que se debe, ahorita subo las pantallas..
Cambia los márgenes antes de
Cambia los márgenes antes de mostrar el diálogo (en el que se requiera), luego restablecelos al cerrarlo (15 para todo en Nimbus si mal no recuerdo).
Cambia los márgenes, , luego restablécelos al cerrarlo
hola que tal ya no subí la otra imagen donde muestro la pantalla con el L&F Metal..
acontinuacion aki pongo la liga
bueno no se a que se debe pero asi se pone los marges... ni aunque cambiando a -15
buenoigual veo que cuando muestro las ventanas JInternalFrame en modo Nimbus, veo que es mas lento, para arrastro con el maus,
y de igual forma si ocupo la de metal, es mas rapido...
Puedes "acelerarlo" ...
¡Ah! Puedes acelerarlo (en Nimbus y también en los otros L&F) si agregas la siguiente propiedad cuando estás configurando la instancia de
javax.swing.JDesktopPane
:Revisé rápidamente (no a profundidad) el código la clase
javax.swing.plaf.metal.MetalLookAndFeel
, pero no encontré una propiedad para modificar los márgenes.~~~
desktopPane.putClientProperty
Esto linea de condigo donde inria.. bueno para hacelerarlo...
a no no se a que se debe pues a lo mejor porque uso mucho el JPanel para mostrar los catálogos, a lo mejor estoy mal. o quien sabe
pero llega enun determinado tiempo que se cuelga la aplicacion y en la salida me marca este error
el programa sigue funcionando
pero me da este error.. claro cuando lo corro en modo Nimbus
at javax.swing.plaf.synth.SynthLookAndFeel.paintRegion(SynthLookAndFeel.java:371)
at javax.swing.plaf.synth.SynthLookAndFeel.update(SynthLookAndFeel.java:335)
at javax.swing.plaf.synth.SynthPanelUI.update(SynthPanelUI.java:153)
at javax.swing.JComponent.paintComponent(JComponent.java:780)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290)
at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
at javax.swing.JComponent._paintImmediately(JComponent.java:5167)
at javax.swing.JComponent.paintImmediately(JComponent.java:4978)
at javax.swing.RepaintManager$4.run(RepaintManager.java:824)
at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:749)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:719)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Por cierto, también puedes
Por cierto, también puedes crear tus propios diálogos.
crear los dialogos
Por cierto este agregue la linea de código
al parecer se agilizo lo de nimbus.. y si he estado pensando hacer mis propios mensajes de dialogo.. de echo la apariencia metal se ve aceptable...
igual el contorno que deja es simétrico en las orillas..
Gracias Jpaul, por estos tips que y sugerencias dadas para mejorar