2012-02-01 40 views
6

Sự cố này được giải quyết.Tạo lời nhắc Java Swing chặn tùy chỉnh

Tôi đang phát triển dự án dựa trên Swing Java và giao diện của ứng dụng là hoàn toàn tùy chỉnh. Chúng tôi đang cố gắng duy trì một diện mạo nhất quán trong suốt chương trình và các cửa sổ hộp thoại Java mặc định không giống nhau.

Sự cố hiện tại yêu cầu cuộc gọi chặn kiểm soát đối với lời nhắc người dùng. Tương tự như JOptionPane.showConfirmDialog() Trong trường hợp này, cuộc gọi tĩnh tạo ra một cửa sổ và tạm dừng luồng của chương trình cho đến khi người dùng chọn một tùy chọn. Nó cũng trả về giá trị của tùy chọn. Lưu ý rằng bản thân GUI không bị khóa một cách hợp lý, nhưng người dùng không thể tương tác với phần còn lại của nó.

int n = JOptionPane.showConfirmDialog(this, 
    "Are you sure?", 
    "Confirm" 
    JOptionPane.YES_NO_OPTION); 

Tôi muốn nhân bản chức năng này với giao diện tùy chỉnh và sử dụng chuỗi. Lý tưởng nhất, mã của tôi sẽ xuất hiện như sau:

String result = CustomPrompt.showPrompt(this, 
    "Please enter your name", //Text 
    "Prompt.",    //Title 
    "John Smith");   //Default 

Điều này thường được sử dụng để nhập mật khẩu và tôi hiểu loại trả về mật khẩu khác nhau, nhưng đây là ví dụ. Điều này có thể được thực hiện bằng cách sử dụng một loạt các nút và sự kiện nghe, trong một số lớp học, nhưng khả năng đọc mã và độ tin cậy của ứng dụng làm giảm.

Khung sẽ được xây dựng qua NetBeans và được tùy chỉnh từ đó. Tôi hiểu rằng một dấu nhắc như vậy đã tồn tại trong Swing, nhưng nó trông như là & là hoàn toàn khác biệt và hoàn toàn khác.

Câu hỏi được tóm tắt: Cách sử dụng khung tùy chỉnh để nhắc người dùng nhập liệu theo cách chặn.

Giải pháp cho vấn đề này là như sau:

public class PromptForm extends JDialog 
{ 
    transient char[] result; 

    public char[] getResult() 
    { 
     return result; 
    } 
    public PromptForm(Frame parent) 
    { 
     super(parent, true); 
     initComponents(); 
    } 
    public void prompt() 
    { 
     this.setVisible(true); 
    } 
    public static char[] promptForPassword(Frame parent) 
    { 
     PromptForm pf = new PromptForm(parent); 
     pf.prompt(); 
     return pf.getResult(); 
    } 
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
    { 
     result = jPasswordField1.getPassword(); 
     setVisible(false); 
     dispose(); 
    } 
    private void initComponents() {...} 

    private javax.swing.JButton jButton1; 
    private javax.swing.JPasswordField jPasswordField1; 
} 

gọi theo:

char [] ret = PromptForm.promptForPassword(this); 
    JOptionPane.showMessageDialog(this, new String(ret), "Neat", JOptionPane.QUESTION_MESSAGE); 
+0

Bạn biết rằng bạn có thể cho bất kỳ JComponent nào (thực sự là bất kỳ đối tượng nào không, nhưng hầu hết các đối tượng sẽ không hoạt động theo cách bạn muốn) làm thông số? Đặt 'this' làm cha mẹ (giống như bạn làm trong ví dụ của bạn) và phần còn lại của GUI sẽ 'khóa'. – Hidde

+0

Rõ ràng là bạn đang làm một số bức tranh tùy chỉnh, không sử dụng LaF tùy chỉnh. – mre

+1

Đúng vậy, nó không thực sự tải một LookAndFeel đúng, nhưng gán thuộc tính cho mỗi thành phần thông qua Netbeans. Bất kể quy trình hoạt động tốt nào, đây là những quy tắc tôi phải tuân theo, được thiết lập từ trên cao. – Reivax

Trả lời

5

Hãy CustomPrompt kéo dài JDialog, có nó là constructor gọi super đi qua các chủ sở hữu Window và mong muốn ModalityType.

public class CustomPrompt extends JDialog { 

    public static String showPrompt(Window parent, String title, String text, 
     String defaultText) { 
    final CustomPrompt prompt = new CustomPrompt(parent); 
    prompt.setTitle(title); 
    // set other components text 
    prompt.setVisible(true); 

    return prompt.textField.getText(); 
    } 

    private JTextField textField; 

    // private if you only want this prompt to be accessible via constructor methods 
    private CustomPrompt(Window parent) { 
    super(parent, Dialog.DEFAULT_MODALITY_TYPE); 
    // Java >= 6, else user super(Frame, true) or super(Dialog, true); 
    initComponents(); // like Netbeans 
    } 

    // initComponents() and irrelevant code. 
} 
+0

Cảm ơn, phương thức là những gì đóng đinh nó. Nhiều đánh giá cao. Giải pháp của tôi: Tạo một lớp PromptForm mở rộng JDialog. Chữ ký constructor: public PromptForm (Frame parent) {super (parent, true); initComponents();} – Reivax