2012-01-16 11 views
40

JOptionPane का उपयोग उपयोगकर्ता से स्ट्रिंग इनपुट प्राप्त करने के लिए किया जा सकता है, लेकिन मेरे मामले में, मैं showInputDialog में एक पासवर्ड फ़ील्ड प्रदर्शित करना चाहता हूं।पासवर्ड प्राप्त करने के लिए जॉप्शनपेन

तरह से मैं जरूरत इनपुट उपयोगकर्ता द्वारा दिए गए नकाबपोश किया जाना चाहिए और वापसी मान char[] में होना चाहिए है। मुझे एक संदेश, पासवर्ड फ़ील्ड और दो बटन के साथ एक संवाद बॉक्स की आवश्यकता है। क्या यह किया जा सकता है? धन्यवाद।

उत्तर

60

हाँ, यह JOptionPane.showOptionDialog() का उपयोग कर सकता है। कुछ इस तरह:

JPanel panel = new JPanel(); 
JLabel label = new JLabel("Enter a password:"); 
JPasswordField pass = new JPasswordField(10); 
panel.add(label); 
panel.add(pass); 
String[] options = new String[]{"OK", "Cancel"}; 
int option = JOptionPane.showOptionDialog(null, panel, "The title", 
         JOptionPane.NO_OPTION, JOptionPane.PLAIN_MESSAGE, 
         null, options, options[1]); 
if(option == 0) // pressing OK button 
{ 
    char[] password = pass.getPassword(); 
    System.out.println("Your password is: " + new String(password)); 
} 
+4

JPasswordField की तरह कुछ के साथ इसे बंद करने के लिए (10) को स्वीकार नहीं करता की आवश्यकता होगी पासवर्ड लंबे समय तक 10. इसे अधिक व्यापक बनाने के लिए बेहतर या नीचे @Adamski जैसे नो-एर्ग कन्स्ट्रक्टर का उपयोग करें। इसके अलावा भी डिफ़ॉल्ट विकल्प होना चाहिए क्योंकि कई उपयोगकर्ता अपना पासवर्ड टाइप करने के बाद एंटर हिट से बाहर होंगे। अगर रद्द करना डिफ़ॉल्ट है तो प्रवेश के बाद पासवर्ड टाइप करना सिर्फ संवाद रद्द कर देगा। – gb96

+0

यह एक अच्छा एक है, JOptionPane में और उसके स्वीकार करने पासवर्ड मेरे मामले में एक JPasswordField साथ एक लेबल से अधिक समय से 10 –

+3

कैसे आप जब संवाद प्रकट होता है फोकस पासवर्ड क्षेत्र देते है? – mjaggard

4

आप खुद वाले संवाद JDialog प्रदान करता है और उसके बाद आप रख सकते हैं जो कुछ भी आप यह चाहते हैं बना सकते हैं।

32

सबसे आसान काम JOptionPane के showConfirmDialog विधि का उपयोग करने के लिए और एक JPasswordField के लिए एक संदर्भ में पारित करने के लिए है, जैसे

JPasswordField pf = new JPasswordField(); 
int okCxl = JOptionPane.showConfirmDialog(null, pf, "Enter Password", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); 

if (okCxl == JOptionPane.OK_OPTION) { 
    String password = new String(pf.getPassword()); 
    System.err.println("You entered: " + password); 
} 

संपादित

नीचे JPasswordField के साथ एक संदेश प्रदर्शित करने के लिए कस्टम JPanel का उपयोग कर एक उदाहरण है। सबसे हाल ही में टिप्पणी के अनुसार, मैं भी है (जल्दी से) जब संवाद पहले प्रदर्शित किया जाता है JPasswordField फोकस हासिल करने के लिए अनुमति देने के लिए कोड जोड़ा।

public class PasswordPanel extends JPanel { 
    private final JPasswordField passwordField = new JPasswordField(12); 
    private boolean gainedFocusBefore; 

    /** 
    * "Hook" method that causes the JPasswordField to request focus the first time this method is called. 
    */ 
    void gainedFocus() { 
    if (!gainedFocusBefore) { 
     gainedFocusBefore = true; 
     passwordField.requestFocusInWindow(); 
    } 
    } 

    public PasswordPanel() { 
    super(new FlowLayout()); 

    add(new JLabel("Password: ")); 
    add(passwordField); 
    } 

    public char[] getPassword() { 
     return passwordField.getPassword(); 
    } 

    public static void main(String[] args) { 
     PasswordPanel pPnl = new PasswordPanel(); 
     JOptionPane op = new JOptionPane(pPnl, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); 

     JDialog dlg = op.createDialog("Who Goes There?"); 

     // Wire up FocusListener to ensure JPasswordField is able to request focus when the dialog is first shown. 
     dlg.addWindowFocusListener(new WindowAdapter() { 
     @Override 
     public void windowGainedFocus(WindowEvent e) { 
      pPnl.gainedFocus(); 
     } 
     }); 

     if (op.getValue() != null && op.getValue().equals(JOptionPane.OK_OPTION)) { 
      String password = new String(pPnl.getPassword()); 
      System.err.println("You entered: " + password); 
     } 
    } 
} 
+0

बस जो मैं खोज रहा था। बीटीडब्ल्यू ** डायलॉग बॉक्स के ** संदेश/बॉडी स्ट्रिंग ** सेट करने का कोई तरीका है? – InamTaj

+0

सबसे आसान तरीका यह एक JPanel कि एक JLabel वांछित पाठ वाले के साथ-साथ दोनों JPasswordField शामिल बनाने के लिए। – Adamski

+0

मुझे पता है कि पहले से ही है लेकिन मैं आवेदन के दौरान एक और फ्रेम _open नहीं करना चाहता है run_। तो मैं ** संदेश स्ट्रिंग ** के साथ अपने समाधान का उपयोग करना चाहता था। – InamTaj

3

यह बातचीत एक बहुत बेहतर लग रहा है अगर आप

dlg.setVisible(true); 

कि बिना कर आप इसे बिल्कुल भी नहीं देख सकते हैं।

इसके अलावा

pPnl.gainedFocus(); 

pPnl.gainedFocus(); 

यह बहुत अच्छा काम करता है उसके अलावा होना चाहिए। कोड के लिए धन्यवाद। स्विंग के साथ मुझे सामना करने का समय बचाया।

इसके अलावा, अगर आप बातचीत की पृष्ठभूमि में आप इसे खोलने हर बार चल रहा है छोड़ने के लिए नहीं करना चाहते हैं, तो आप

dlg.dispatchEvent(new WindowEvent(dlg, WindowEvent.WINDOW_CLOSING)); 
dlg.dispose(); // else java VM will wait for dialog to be disposed of (forever) 
संबंधित मुद्दे