2011-07-13 18 views
5

Esto puede parecer trivial, pero no puedo entender cómo dar la contraseña en este foco de diálogo.¿Cómo puedo dar este enfoque de campo de contraseña?

import javax.swing.JOptionPane; 
import javax.swing.JPasswordField; 

public class PasswordBox { 
    @SuppressWarnings("unused") 
    public String prompt() { 
     JPasswordField pass = new JPasswordField(10); 
     int action = JOptionPane.showConfirmDialog(null, pass,"Enter Password",JOptionPane.OK_CANCEL_OPTION); 
     return new String(pass.getPassword()); 
    } 
} 

invoco de otras clases como esto: String tmpPASS = new PasswordBox().prompt();

Por alguna razón, cuando el diálogo se muestra, el botón "OK" se pone el foco.

StackTrace (véase la respuesta de Eng.Fouad):

at javax.swing.JComponent.addNotify(Unknown Source) 
at PasswordBox$1.addNotify(PasswordBox.java:14) 
at java.awt.Container.addNotify(Unknown Source) 
+0

http://stackoverflow.com/questions/6251665/setting-component -focus-in-joptionpane-showoptiondialog/21426340 # –

Respuesta

7

Mira la solución presentada en Dialog Focus.

Editar:

Utilizando el enfoque sugerido por el Ing Fouad creo que el código debe ser:

JPasswordField pass = new JPasswordField(10)   
{ 
    public void addNotify()    
    {     
     super.addNotify(); 
     requestFocusInWindow();    
    }   
}; 

Edit2:

El eslabón de la entrada de blog "Diálogo de enfoque" tiene un comentario con una sugerencia que funciona en Linux.

+0

Intenté esta solución con AncestorListener. Lamentablemente, las devoluciones de llamada no se llaman en absoluto, por lo que el código no funciona. ¿Qué pasa? – AlexR

+0

Lo he probado en JDK6_7 en XP. Tal vez es un problema de versión/plataforma? Uno de los comentarios sugirió usar un HierarchyListener. Pruébalo y mira qué pasa. – camickr

+0

¡La solución presentada en el enlace Dialog Focus funcionó para mí! :) –

0

El problema es que JOptionPane es completamente autónomo, y parece que no ofrece ninguna forma de especificar qué componente de la GUI obtiene el foco inicial. Una solución sería escribir su propia subclase de diálogo, que le permitirá controlar el diseño exactamente y establecer el enfoque de manera adecuada.

También puede probar un javax.swing.SwingWorker. Puede crear uno de estos y comenzarlo ANTES de mostrar el cuadro de diálogo de contraseña. En el método doInBackground(), duerma durante un tiempo corto, en el método done() use SwingUtilties.invokeLater() y dentro de ese Runnable, emita pass.requestFocusInWindow().

1
import javax.swing.JOptionPane; 
import javax.swing.JPasswordField; 

public JOptionPane pane; 

public class PasswordBox 
{ 
    @SuppressWarnings("unused") 
    public String prompt() 
    { 
     pane = new JOptionPane(); 
     JPasswordField pass = new JPasswordField(10) 
     { 
      public void addNotify() 
      { 
       pane.addNotify(); 
       requestFocus(); 
      } 
     }; 
     int action = pane.showConfirmDialog(null, pass,"Enter Password",JOptionPane.OK_CANCEL_OPTION); 
     return new String(pass.getPassword()); 
    } 
} 

o aquí es otra manera de hacerlo:

JPanel panel = new JPanel(); 
JPasswordField pass = new JPasswordField(10) 
{ 
    public void addNotify() 
    { 
     panel.addNotify(); 
     requestFocus(); 
    } 
}; 
panel.add(pass); 
JOptionPane pane = new JOptionPane(); 
JButton btnOK = new JButton("OK"); 
JButton btnCancel = new JButton("Cancel"); 
Object[] options = {btnOK, btnCancel}; 
pane.showOptionDialog(null, panel, "Enter the password", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, null); 

Editar (por camickr, no dude en eliminar si esto no es correcto). Creo que el código debe ser:

JPasswordField pass = new JPasswordField(10)   
{ 
    public void addNotify()    
    {     
     super.addNotify(); 
     requestFocusInWindow();    
    }   
}; 
+0

No pude hacer que esto funcione. A menos que me esté perdiendo algo. – n0pe

+0

@MaxMackie mira la actualización, espero que esto funcione –

+0

Tuve que agregar "final" a la declaración del panel, pero todavía no funciona.Gracias por su ayuda, sin embargo, se lo agradece :) – n0pe

Cuestiones relacionadas