Эта проблема решена.
Я разрабатываю проект на основе 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);
this
в качестве родителя (как вы делаете в своем примере), а остальная часть графического интерфейса должна «заблокироваться». - person Hidde   schedule 01.02.2012