2012-02-01 12 views
6

Questo problema è risolto.Creazione di un blocco personalizzato Messaggio Java Swing

Sto sviluppando un progetto basato su Java Swing e il look & è completamente personalizzato. Stiamo cercando di mantenere un aspetto coerente in tutto il programma e le finestre di dialogo Java predefinite non sono le stesse.

Il problema corrente richiede una chiamata di blocco del controllo al prompt dell'utente. Simile a JOptionPane.showConfirmDialog() In questo caso, la chiamata statica produce una finestra e interrompe il flusso del programma finché l'utente non seleziona un'opzione. Restituisce anche il valore dell'opzione. Si noti che la GUI stessa non è bloccata logicamente, ma l'utente non può interagire con il resto.

int n = JOptionPane.showConfirmDialog(this, 
    "Are you sure?", 
    "Confirm" 
    JOptionPane.YES_NO_OPTION); 

Vorrei duplicare questa funzionalità con un aspetto personalizzato e utilizzando una stringa. Idealmente, il mio codice apparirebbe come segue:

String result = CustomPrompt.showPrompt(this, 
    "Please enter your name", //Text 
    "Prompt.",    //Title 
    "John Smith");   //Default 

Questo in genere da utilizzare per l'immissione della password, e capisco il tipo di ritorno di una password è diversa, ma questo è un esempio. Questo può essere ottenuto utilizzando una serie di pulsanti e ascoltatori di eventi, in diverse classi, ma la leggibilità del codice e l'affidabilità dell'applicazione diminuiscono.

Il frame sarebbe stato creato tramite NetBeans e personalizzato da lì. Capisco che una tale richiesta esiste già in Swing, ma è aspetto & sentire è completamente e completamente diverso.

La domanda riepilogata: Come utilizzare un frame personalizzato per richiedere all'utente l'immissione in blocco.

La soluzione a questo problema è la seguente:

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; 
} 

chiamato da:

char [] ret = PromptForm.promptForPassword(this); 
    JOptionPane.showMessageDialog(this, new String(ret), "Neat", JOptionPane.QUESTION_MESSAGE); 
+0

Voi sapete che si può dare qualsiasi JComponent (in realtà qualsiasi oggetto, ma la maggior parte oggetti non funziona nel modo desiderato a) come parametro? Dà "questo" come genitore (come fai nel tuo esempio), e il resto della GUI dovrebbe "bloccarsi". – Hidde

+0

Ovviamente stai facendo un disegno personalizzato, non usando un LaF personalizzato. – mre

+1

Sì, è corretto, in realtà non sta caricando un vero LookAndFeel, ma l'assegnazione di proprietà a ciascun componente tramite Netbeans. Indipendentemente dalla buona procedura operativa, queste sono le regole che devo seguire, stabilite dall'alto. – Reivax

risposta

5

Fai CustomPrompt estende JDialog, avere è costruttore chiamata super passando il proprietario Window e il desiderato 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. 
} 
+0

Grazie, modal è ciò che lo ha inchiodato. Molto apprezzato. La mia soluzione: creare una classe PromptForm che estende JDialog. Firma costruttore: public PromptForm (frame parent) {super (parent, true); initComponents();} – Reivax