2012-02-01 1 views
6

Эта проблема решена.Создание пользовательской блокировки подсказки Swing Java

Я разрабатываю Java Swing на основе проецируемого изображения и внешний вид приложения полностью настраивается. Мы стараемся поддерживать постоянный внешний вид всей программы, а диалоговые окна по умолчанию для Java не совпадают.

Текущая проблема требует вызова блокировки управления для пользовательской подсказки. Подобно JOptionPane.showConfirmDialog() В этом случае статический вызов создает окно и останавливает поток программы, пока пользователь не выберет опцию. Он также возвращает значение параметра. Обратите внимание, что сам GUI не заблокирован логически, но пользователь не может взаимодействовать с остальной частью.

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

Я хотел бы дублировать эту функциональность с помощью настраиваемого внешнего вида и использовать строку. В идеале, мой код будет выглядеть следующим образом:

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

Это, как правило, используется для ввода пароля, и я понимаю, возвращаемый тип пароля отличается, но это пример. Это может быть достигнуто с помощью серии кнопок и прослушивателей событий в нескольких классах, но читаемость кода и надежность приложения уменьшаются.

Рамка будет построена через NetBeans и настроена оттуда. Я понимаю, что такое приглашение уже существует в Swing, но это выглядит совершенно неожиданно.

Заданный вопрос: как использовать настраиваемый фрейм, чтобы запросить пользователя для ввода блокирующим способом.

Решение этой проблемы заключается в следующем:

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

Вызывается:

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

Вы знаете, что можете указать любой JComponent (фактически любой объект, но большинство объектов не будет работать так, как вы хотите) в качестве параметра? Дайте 'this' в качестве родителя (как и в вашем примере), а остальная часть GUI должна« запереть ». – Hidde

+0

Очевидно, что вы выполняете какую-то обычную роспись, не используя пользовательский LaF. – mre

+1

Да, это правильно, на самом деле это не загрузка истинного LookAndFeel, а назначение свойств каждому компоненту через Netbeans. Независимо от хорошей процедуры работы, это правила, которым я должен следовать, начиная с максимума. – Reivax

ответ

5

Сделать CustomPrompt расширяет JDialog, есть это вызов конструктора super передавая владельцу Window и желаемый 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

Спасибо, modal - это то, что прибило его. Очень признателен. Мое решение: создайте класс PromptForm, расширяющий JDialog. Подпись конструктора: public PromptForm (родитель кадров) {super (parent, true); initComponents();} – Reivax