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,

JPPAsignacion llama = new JPPAsignacion(objRemoto);
        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

AdjuntoTamaño
Pantalla.png98.73 KB
pantalla2.png58.98 KB
Captura de pantalla de 2015-03-16 12:28:11.png236.14 KB
show internal1.png258.84 KB
show internal2.png246.8 KB

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Re: minimizar

 

¿Y por qué alguien querría hacer algo como eso? Bueno, cada quien. Respecto al asunto de minimizar (1):

Minimizing, Maximizing, and Closing Blocked Windows

When a modal dialog box blocks a window, the user may not be able to minimize or maximize the blocked window. However, the actual behavior is unspecified and platform-dependent. In any case, the user can't close the blocked window interactively. But it can be closed programmatically by calling the setVisible(false) or dispose() methods on the blocked window.


Notas

  1. The New Modality API in Java SE 6.

~~~

Imagen de pechsclk

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

Imagen de pechsclk

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.

Imagen de pechsclk

aun-no

Aun no he solucionado... help

Ejemplo con ponis

 

Ponis

He aquí un pequeño ejemplo:

public static void main(String[] args) {
    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!

~~~

Imagen de pechsclk

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.

Imagen de chicowed

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.

Imagen de ezamudio

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:

public static class Datos {
  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:

public class Ventana1 implements ProveedorDatos {
  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:

public class Ventana2 {
  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);
  }
}
Imagen de chicowed

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:

 private void miTablaMouseClicked(java.awt.event.MouseEvent evt) {                                                
        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());

    }                                              

Imagen de ezamudio

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".

Imagen de chicowed

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...

Imagen de pechsclk

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,

JPPAsignacion llama = new JPPAsignacion(objRemoto);
        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?

Imagen de pechsclk

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

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...

Esto se puede configurar de la siguiente manera:

UIManager.put("OptionPane.contentMargins", new javax.swing.plaf.InsetsUIResource(0, 0, 0, 0));

¡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.

~~~

Imagen de pechsclk

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.

Imagen de pechsclk

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

Imagen de pechsclk

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

 public static void main(String args[]) {
        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

javax.swing.UIManager.put("OptionPane.contentMargins", new javax.swing.plaf.InsetsUIResource(0, 0, -15, 0));

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).

Imagen de pechsclk

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

  • http://sim1.subirimagenes.net/img/2015/03/19/150319103533454335.png
  • 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:

    desktopPane.putClientProperty("JDesktopPane.dragMode", "outline");

    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.

    ~~~

    Imagen de pechsclk

    desktopPane.putClientProperty

    Esto linea de condigo donde inria.. bueno para hacelerarlo...

    desktopPane.putClientProperty("JDesktopPane.dragMode", "outline");

    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

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
            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.

    Imagen de pechsclk

    crear los dialogos

    Por cierto este agregue la linea de código

    desktopPane.putClientProperty("JDesktopPane.dragMode", "outline");

    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