2012-06-25 28 views
10

Tengo un diálogo de configuración modal que es un JDialog. En esta ventana de configuración, coloqué algunos componentes, incluido un botón, en otro cuadro de diálogo de configuración modal que también es un JDialog. Los hice JDialogs porque esa es la única forma que conozco de hacer un diálogo modal.Cómo crear un JDialog modal encima de otro modal JDialog

El problema es este: cuando creo el diálogo de configuración principal, tengo que construir el JDialog sin un Marco padre o con un Marco padre. Como mi ventana principal es un JFrame, puedo pasar eso al constructor del diálogo de configuración principal. Pero cuando quiero crear el segundo cuadro de diálogo de configuración modal que debe tener el diálogo de configuración principal como primario, no puedo encontrar una forma de obtener el Marco (J) del JDialog. Quiero pasar ese diálogo de configuración principal como padre para que el segundo diálogo de configuración se centre en él cuando se muestre. Supongamos que el segundo cuadro de diálogo de configuración no tiene un constructor para pasar una ubicación, solo los constructores de JDialog.

¿Hay alguna manera de obtener el marco (J) de un JDialog? ¿Existe un error de diseño en mi configuración y debería haber usado algo más para estos cuadros de diálogo de configuración? (Y si es así, ¿cómo debo realizar estos ajustes alternativos diálogos modales?)

Gracias por su ayuda, Erik

ACTUALIZACIÓN: Gracias a todos por sus respuestas. Me llevaron a entender que aparentemente no es absolutamente necesario tener un propietario para un JDialog. Pensé que esto era necesario para que el diálogo pueda deshabilitar al propietario hasta que se cierre el cuadro de diálogo, pero aparentemente la modalidad es independiente del propietario. También me di cuenta de que incluso con un propietario del cuadro de diálogo sigue sin centrar en el propietario, por lo que ahora es mi código como:

public class CustomDialog extends JDialog { 
    public CustomDialog(String title) { 
     setModal(true); 
     setResizable(false); 
     setTitle(title); 

     buildGUI(); 
    } 

    public Result showDialog(Window parent) { 
     setLocationRelativeTo(parent); 
     setVisible(true); 
     return getResult(); 
    } 
} 

Esto también permite diálogos modales en cuadros de diálogo modales.

¡Gracias por toda su ayuda!

+0

yo no haría la ventana de configuración debe ser modal a cualquier cosa. ¿Qué ocurre si necesitan usar la aplicación mientras trabajan en la ventana de configuración? Me parece muy restrictivo. –

Respuesta

13
No

seguro de qué es exactamente lo que tienes como un problema, pero aquí es un ejemplo de cómo se puede tener múltiples cuadros de diálogo modales:

import java.awt.BorderLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestDialog { 

    protected static void initUI() { 
     JPanel pane = newPane("Label in frame"); 
     JFrame frame = new JFrame("Title"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(pane); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static JPanel newPane(String labelText) { 
     JPanel pane = new JPanel(new BorderLayout()); 
     pane.add(newLabel(labelText)); 
     pane.add(newButton("Open dialog"), BorderLayout.SOUTH); 
     return pane; 
    } 

    private static JButton newButton(String label) { 
     final JButton button = new JButton(label); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Window parentWindow = SwingUtilities.windowForComponent(button); 
       JDialog dialog = new JDialog(parentWindow); 
       dialog.setLocationRelativeTo(button); 
       dialog.setModal(true); 
       dialog.add(newPane("Label in dialog")); 
       dialog.pack(); 
       dialog.setVisible(true); 
      } 
     }); 
     return button; 
    } 

    private static JLabel newLabel(String label) { 
     JLabel l = new JLabel(label); 
     l.setFont(l.getFont().deriveFont(24.0f)); 
     return l; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 
+0

Bien, pero ¿por qué los nuevos 'JDialog' se abren en forma de escalera? – zygimantus

+1

@zygimantus Eso es causado directamente por la llamada a 'dialog.setLocationRelativeTo (button)' –

5

1.please leer The New Modality API in Java SE 6

2.Is Hay una manera de conseguir el (J) del marco de un JDialog?

Window ancestor = SwingUtilities.getWindowAncestor(this); 

o

Window ancestor = (Window) this.getTopLevelAncestor(); 
Cuestiones relacionadas