Создание настраиваемой блокировки Java Swing - PullRequest
6 голосов
/ 01 февраля 2012

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

Я занимаюсь разработкой проекции на основе 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);

1 Ответ

5 голосов
/ 01 февраля 2012

Make CustomPrompt extends 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. 
}
...