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);
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
Ovviamente stai facendo un disegno personalizzato, non usando un LaF personalizzato. – mre
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