attraversare JPanel
-
10-07-2019 - |
Domanda
Per inizializzare tutti i JTextfField
su un JPanel
quando gli utenti fanno clic su un pulsante "cancella", devo scorrere il JPanel
(anziché impostare tutti i singoli campi su " ").
Come posso usare un ciclo for-each per scorrere attraverso JPanel
alla ricerca di JTextField
s?
Soluzione
for (Component c : pane.getComponents()) {
if (c instanceof JTextField) {
((JTextField)c).setText("");
}
}
Ma se hai JTextFields più profondamente annidato, puoi utilizzare il seguente modulo ricorsivo:
void clearTextFields(Container container) {
for (Component c : container.getComponents()) {
if (c instanceof JTextField) {
((JTextField)c).setText("");
} else
if (c instanceof Container) {
clearTextFields((Container)c);
}
}
}
Modifica: Un esempio per il suggerimento di Tom Hawtin - tackline sarebbe quello di avere un elenco nella tua classe di frame:
List<JTextField> fieldsToClear = new LinkedList<JTextField>();
e quando si inizializzano i singoli campi di testo, aggiungerli a questo elenco:
someField = new JTextField("Edit me");
{ fieldsToClear.add(someField); }
e quando l'utente fa clic sul pulsante Cancella, basta:
for (JTextField tf : fieldsToClear) {
tf.setText("");
}
Altri suggerimenti
Mentre un'altra risposta mostra un modo diretto per risolvere il tuo problema, la tua domanda implica una soluzione scadente.
Generalmente vogliono che le dipendenze statiche tra i layer siano a senso unico. Dovresti andare in un pacchetto attraverso getCommponents
. Casting (assumendo generici) è un modo semplice per vedere che qualcosa è andato storto.
Quindi, quando si creano i campi di testo per un modulo, aggiungerli all'elenco da cancellare in un'operazione di cancellazione, nonché aggiungerli al pannello. Naturalmente nel codice reale probabilmente ci sono altre cose che vuoi fare anche a loro. Nel vero codice probabilmente vorrai avere a che fare con modelli (possibilmente Document
) piuttosto che JComponent
s.