Este problema está resuelto.Creando un bloqueo de Java personalizado prompt
Estoy desarrollando una versión basada en Java Swing, y la apariencia & de la aplicación es completamente personalizada. Estamos tratando de mantener una apariencia coherente en todo el programa, y las ventanas de diálogo de Java por defecto no son las mismas.
El problema actual requiere una llamada de bloqueo de control al prompt del usuario. Similar a JOptionPane.showConfirmDialog() En este caso, la llamada estática produce una ventana y detiene el flujo del programa hasta que el usuario seleccione una opción. También devuelve el valor de la opción. Tenga en cuenta que la GUI misma no está bloqueada lógicamente, pero el usuario no puede interactuar con el resto.
int n = JOptionPane.showConfirmDialog(this,
"Are you sure?",
"Confirm"
JOptionPane.YES_NO_OPTION);
me gustaría duplicar esta funcionalidad con una apariencia personalizada, y el uso de una cadena. Lo ideal es que mi código aparecería como sigue:
String result = CustomPrompt.showPrompt(this,
"Please enter your name", //Text
"Prompt.", //Title
"John Smith"); //Default
Esto generalmente se usará para la introducción de la contraseña, y entiendo el tipo de retorno de la contraseña es diferente, pero esto es un ejemplo. Esto se puede lograr utilizando una serie de oyentes de botones y eventos, en varias clases, pero la legibilidad del código y la confiabilidad de la aplicación disminuyen.
El marco se construirá a través de NetBeans y se personalizará desde allí. Entiendo que ese aviso ya existe en Swing, pero su apariencia es & y es completamente diferente.
La pregunta resumida: Cómo utilizar un marco personalizado para solicitar al usuario una entrada de forma bloqueante.
La solución a este problema es el siguiente:
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;
}
llamado por:
char [] ret = PromptForm.promptForPassword(this);
JOptionPane.showMessageDialog(this, new String(ret), "Neat", JOptionPane.QUESTION_MESSAGE);
¿Sabe que puede asignarle a cualquier JComponent (en realidad, cualquier Objeto, pero la mayoría de los Objetos no funcionarán como usted lo desea) como parámetro? Dé 'this' como padre (como lo hace en su ejemplo), y el resto de la GUI debe 'bloquearse'. – Hidde
Obviamente está haciendo algunas pinturas personalizadas, sin utilizar un LaF personalizado. – mre
Sí, eso es correcto, en realidad no está cargando un verdadero LookAndFeel, sino asignando propiedades a cada componente a través de Netbeans. Independientemente del buen procedimiento operativo, estas son las reglas que debo seguir, establecidas desde arriba. – Reivax