Эта проблема решена.Создание пользовательской блокировки подсказки 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);
Вы знаете, что можете указать любой JComponent (фактически любой объект, но большинство объектов не будет работать так, как вы хотите) в качестве параметра? Дайте 'this' в качестве родителя (как и в вашем примере), а остальная часть GUI должна« запереть ». – Hidde
Очевидно, что вы выполняете какую-то обычную роспись, не используя пользовательский LaF. – mre
Да, это правильно, на самом деле это не загрузка истинного LookAndFeel, а назначение свойств каждому компоненту через Netbeans. Независимо от хорошей процедуры работы, это правила, которым я должен следовать, начиная с максимума. – Reivax