Создание пользовательского блокирующего приглашения Java Swing

Эта проблема решена.

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

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

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

person Reivax    schedule 01.02.2012    source источник
comment
Вы знаете, что вы можете указать любой JComponent (на самом деле любой объект, но большинство объектов не будет работать так, как вы хотите) в качестве параметра? Укажите this в качестве родителя (как вы делаете в своем примере), а остальная часть графического интерфейса должна «заблокироваться».   -  person Hidde    schedule 01.02.2012
comment
Очевидно, вы рисуете на заказ, а не используете собственный LaF.   -  person mre    schedule 01.02.2012
comment
Да, это правильно, на самом деле это не загрузка истинного LookAndFeel, а назначение свойств каждому компоненту через Netbeans. Независимо от хорошей операционной процедуры, я должен следовать этим правилам, установленным свыше.   -  person Reivax    schedule 01.02.2012
comment
@Reivax, спасибо за подтверждение!   -  person mre    schedule 01.02.2012


Ответы (1)