2011-07-13 27 views
5

Điều này có vẻ tầm thường, nhưng tôi không thể tìm ra cách để cung cấp hộp mật khẩu trong tiêu điểm hội thoại này.Làm cách nào để tôi có thể tập trung vào trường mật khẩu này?

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

tôi gọi nó từ các lớp khác như thế này: String tmpPASS = new PasswordBox().prompt();

Đối với một số lý do, khi hộp thoại xuất hiện, nút "OK" được tập trung.

stacktrace (xem câu trả lời Eng.Fouad của):

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

Trả lời

7

Kiểm tra các giải pháp được trình bày trong Dialog Focus.

Edit:

Sử dụng phương pháp này được đề xuất bởi Eng Fouad Tôi tin rằng mã nên được:

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

Edit2:

Các liên kết trong "Dialog Focus" blog entry có một lời nhận xét với một đề xuất hoạt động trên Linux.

+0

Tôi đã thử giải pháp này với AncestorListener. Thật không may, callback không được gọi, vì vậy mã không hoạt động. Chuyện gì vậy? – AlexR

+0

Tôi đã thử nghiệm nó trên JDK6_7 trên XP. Có thể đó là vấn đề về phiên bản/nền tảng? Một trong các nhận xét được đề xuất bằng cách sử dụng Trình phân cấp. Hãy thử điều đó và xem điều gì xảy ra. – camickr

+0

Giải pháp được trình bày trong liên kết Dialog Focus làm việc cho tôi! :) –

0

Vấn đề là JOptionPane là hoàn toàn khép kín, và dường như không cung cấp cách nào để xác định thành phần GUI nào lấy nét ban đầu. Một giải pháp là viết lớp con của riêng bạn của Hộp thoại - điều này sẽ cho phép bạn kiểm soát bố cục chính xác và đặt trọng tâm phù hợp.

Bạn cũng có thể thử javax.swing.SwingWorker. Bạn có thể tạo một trong số này và bắt đầu nó TRƯỚC KHI hiển thị hộp thoại mật khẩu. Trong phương thức doInBackground(), ngủ trong một thời gian ngắn, trong phương thức done() đã sử dụng SwingUtilties.invokeLater() và trong Runnable đó, hãy phát hành 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()); 
    } 
} 

hoặc đây là một cách khác để làm điều đó:

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

Chỉnh sửa (bằng camickr, cảm thấy tự do để loại bỏ nếu điều này là không đúng). Tôi tin rằng mã nên được:

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

Tôi không thể làm việc này. Trừ khi tôi đang thiếu một cái gì đó. – n0pe

+0

@MaxMackie xem bản cập nhật, tôi hy vọng công trình này –

+0

Đã phải thêm "cuối cùng" vào khai báo của khung, nhưng nó vẫn không hoạt động.Cảm ơn sự giúp đỡ của bạn mặc dù, nó được đánh giá cao :) – n0pe

Các vấn đề liên quan