2012-02-01 27 views
6

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

¿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

+0

Obviamente está haciendo algunas pinturas personalizadas, sin utilizar un LaF personalizado. – mre

+1

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

Respuesta

5

Hacer CustomPrompt extiende JDialog, tener su llamada al constructor super pasando el propietario Window y la ModalityType deseada.

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. 
} 
+0

Gracias, modal es lo que lo clavó. Muy apreciado. Mi solución: crear una clase PromptForm que extienda JDialog. Firma del constructor: public PromptForm (Frame parent) {super (parent, true); initComponents();} – Reivax