2011-07-13 14 views
5

Może wydawać się to banalne, ale nie mogę wymyślić, jak podać pole hasła w tym oknie dialogowym.Jak mogę ustawić ostrość tego pola hasł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()); 
    } 
} 

wzywam go od innych klas tak: String tmpPASS = new PasswordBox().prompt();

Z jakiegoś powodu, gdy pojawia się okno dialogowe, przycisk „OK” staje się skupić.

StackTrace (patrz odpowiedź Eng.Fouad za):

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 # –

Odpowiedz

7

Zapoznaj się rozwiązanie przedstawione w Dialog Focus.

Edit:

Stosując podejście sugerowane przez inż Fouad Wierzę, że kod powinien być:

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

Edit2:

Link w "Dialog Focus" blogu ma komentarz z sugestią działającą na Linuksie.

+0

Próbowałem tego rozwiązania z AncestorListener. Niestety wywołania zwrotne nie są w ogóle wywoływane, więc kod nie działa. Co jest nie tak? – AlexR

+0

Testowałem to na JDK6_7 na XP. Może to jest problem z wersją/platformą? Jeden z komentarzy sugeruje użycie HierarchyListener. Wypróbuj to i zobacz, co się stanie. – camickr

+0

Rozwiązanie zastosowane w łączu Dialog Focus działało dla mnie! :) –

0

Problem polega na tym, że JOptionPane jest całkowicie samowystarczalny i wydaje się nie oferować możliwości określenia, który komponent GUI uzyska początkową fokus. Jednym z rozwiązań byłoby napisanie własnej podklasy Dialog - która pozwoli ci dokładnie kontrolować układ i odpowiednio ustawić ostrość.

Możesz również wypróbować javax.swing.SwingWorker. Możesz utworzyć jeden z nich i uruchomić go PRZED wyświetleniem okna dialogowego hasła. W metodzie doInBackground(), śpij przez krótki czas, w metodzie done() użyj SwingUtilties.invokeLater() iw tym Runnable, wydaj 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()); 
    } 
} 

czy tu jest kolejnym sposobem, aby to zrobić:

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

Edit (przez camickr, nie krępuj się usunąć, jeśli to nie jest poprawna). Wierzę, że kod powinien być:

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

Nie mogłem tego uruchomić. Chyba że czegoś mi brakuje. – n0pe

+0

@MaxMackie zobacz aktualizację, mam nadzieję, że działa –

+0

Musiał dodać "końcowy" do deklaracji okienka, ale nadal nie działa.Dzięki za pomoc mimo, że jest doceniana :) – n0pe

Powiązane problemy