2010-12-28 17 views
5

Me pregunto si es posible obtener una referencia al objeto (JDialog?) Creado por uno de esos métodos estáticos de JOptionPane (por ejemplo, showMessageDialog)? Tengo la intención de modificar la posición donde aparece el cuadro de diálogo en la pantalla. Más específicamente, quiero que el cuadro de diálogo aparezca en la esquina superior izquierda de la ventana principal de la aplicación, en lugar del centro de la ventana de forma predeterminada. Así que tener una referencia al objeto me permitiría usar setLocation para lograr el efecto deseado ...Obteniendo una referencia al objeto creado por JOptionPane métodos estáticos

¡Cualquier sugerencia sería apreciada! ¡Gracias!

Respuesta

7

los showXXXDialog() métodos estáticos son sólo por conveniencia. Si observa el código fuente JOptionPane, encontrará que, en realidad, se crea un objeto JOptionPane según las opciones que especifique y luego se llama al JOptionPane.createDialog(...). Uno de los métodos para mostrar su diálogo de mensaje en una posición diferente es:

JOptionPane pane = new JOptionPane("Message", JOptionPane.WARNING_MESSAGE, 
     JOptionPane.DEFAULT_OPTION); 
JDialog dialog = pane.createDialog("TITLE"); 
dialog.setLocation(0, 0); 
dialog.setVisible(true); 

// dialog box shown here 

dialog.dispose(); 
Object selection = pane.getValue(); 

Con una combinación de parámetros a la JOptionPane constructor, y JOptionPane métodos set, se puede hacer cualquier cosa que hubiera hecho con los métodos estáticos, además de que tener acceso al objeto JDialog.

editado: (añadir ejemplo de diálogo de entrada para OP)

JOptionPane pane = new JOptionPane("Message", JOptionPane.QUESTION_MESSAGE, 
     JOptionPane.OK_CANCEL_OPTION, null, null, null); 
pane.setWantsInput(true); 
JDialog dialog = pane.createDialog(null, "Title"); 
dialog.setLocation(0, 0); 
dialog.setVisible(true); 

String str = (String) pane.getInputValue(); 
+0

frío, puedo ver cómo puedo aplicar lo anterior a showMessageDialog, showConfirmDialog, etc, pero ¿qué pasa con la implementación de showInputDialog? ¿Cómo implemento un campo de texto de entrada en JDialog? – skyork

+0

@ user548240 - ejemplo agregado de inputDialog –

+0

Genial, estaba pensando en construirlo desde cero y no sabía que hay métodos disponibles en JOptionPane. ¡Gracias! – skyork

0

El JOptionPane utilizará el parentComponent (primer parámetro del método) dada para determinar dónde centrar el diálogo (por ejemplo en javax.swing.JOptionPane.showMessageDialog (Componente, Object))

Se podría tratar de pasar en un componente falso que posiciona el cuadro de diálogo a otra ubicación, por ejemplo, así:

JFrame frame = new JFrame("Test"); 
    frame.setLocation(100, 100); 
    frame.setSize(500, 500); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

    // 'Invisible' fake component for positioning 
    JWindow c = new JWindow(); 
    c.setSize(0, 0); 
    c.setVisible(true); 
    Point location = frame.getLocation(); 
    location.translate(200, 100); 
    c.setLocation(location); 

    JOptionPane.showInputDialog(c,"Foo"); 
Cuestiones relacionadas