Ottenere INVIO per lavorare con un JSpinner il modo in cui lo fa con un JTextField
-
22-08-2019 - |
Domanda
In primo luogo, a fare il mio lavoro che spiega un po 'più facile, ecco alcuni dei miei codice:
JSpinner spin = new JSpinner();
JFormattedTextField text = getTextField(spin);
text.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
// Do stuff...
}
});
...
private JFormattedTextField getTextField(JSpinner spinner) {
JComponent editor = spinner.getEditor();
if (editor instanceof JSpinner.DefaultEditor) {
return ((JSpinner.DefaultEditor )editor).getTextField();
} else {
System.err.println( "Unexpected editor type: "
+ spinner.getEditor().getClass()
+ " isn't a descendant of DefaultEditor" );
return null;
}
}
Quindi, come potete vedere, ho avuto così lontano. E in effetti, quando si digita un valore nel componente campo di testo del filatore (JFormattedTextField
), quindi premere invio, funziona.
Quello che voglio ora è quello di essere in grado di avere rispondono campo di testo per entrare senza dover digitare manualmente un nuovo valore (che sconfigge sorta allo scopo di fare un filatore fuori di esso). Come faccio a farlo?
Soluzione
So che questo non è l'ascoltatore azione ... ma forse questo può funzionare per voi?
text.addKeyListener( new KeyAdapter() {
@Override
public void keyReleased( final KeyEvent e ) {
if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
System.out.println( "enter pressed" );
}
}
} );
Altri suggerimenti
Ho appena incontrato un problema relativo a questo, io stesso. Nel mio caso, ho avuto un JSpinner con una configurazione SpinnerNumberModel
così ho potuto ingresso valori ID numerici, e poi recuperare da un database remoto. Questo ha funzionato tutto molto bello con un JButton come il mio innesco per la query, ma ho voluto essere in grado di passare attenzione al campo di via Tab e premere invio, e anche in grado di modificare il valore inserendo un ID con i tasti numerici , quindi premere Invio.
Quello che mi stava dando la maggior parte dei problemi stava entrando manualmente l'ID con i tasti numerici, quindi premere Invio. Quando farei questo, l'interrogazione sarebbe ancora accaduto, ma era l'interrogazione l'ID precedente, piuttosto che quello che ho appena entrato, quindi mi piacerebbe avere a colpire entrare di nuovo per interrogare il nuovo ID (vedi codice)
((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
queryData();
}
}
});
e il metodo query:
private void queryData() {
int minVal = Integer.parseInt(minRng.getValue().toString());
queryDataBase(minVal);
}
Per risolvere questo problema, tutto quello che dovevo fare era forzare la query di aspettare di correre fino a quando il filatore ha aggiornato il suo valore, che è stato fatto facilmente utilizzando SwingUtilities.invokeLater()
per costringere alla fine della coda EDT, in questo modo:
((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
queryData();
}
});
}
}
});
Grazie alla invokeLater()
query ora avviene sul nuovo valore piuttosto che quello precedente, premendo immettere, come JSpinner ha quindi aggiornato il suo valore a quello appena ingresso.
sto assumendo la ragione di questo è che il valore immesso non è ufficialmente applicato al JSpinner
fino a colpire entrare, che spara anche l'ascoltatore chiave per la query. Il KeyEvent
per il costume [domanda] ascoltatore chiave sembra essere il primo in coda, in modo che sia il suo codice prima, e poi la KeyEvent
per applicare il valore alla JSpinner
dal JFormattedTextField
interna, è per questo che interroga il vecchio valore. SwingUtilities.invokeLater()
mette solo la query stessa alla fine della coda, in modo da permette l'altro KeyEvent
di terminare il proprio codice prima di eseguire la query.
Modifica
Un altro modo per raggiungere questo obiettivo è quello di richiedere il valore direttamente dal JFormattedTextField
piuttosto che il JSpinner
, come questo dovrebbe anche restituire il valore neo entrato dal momento che il JFormattedTextField
contiene il valore digitato in, ma non è ancora stato passato a la JSpinner, che sembra essere dove il problema risiede.
private void queryData() {
JFormattedTextField tf = ((JSpinner.DefaultEditor) minRng.getEditor()).getTextField();
int minVal = Integer.parseInt(tf.getText());
queryDataBase(minVal);
}
L'unico problema con questo metodo è che è quindi necessario raccogliere eventuali NumberFormatException
s, durante l'analisi del valore, in cui l'approccio SwingUtilities.invokeLater()
permette al modello di trottola per rimuovere eventuali caratteri non validi, automaticamente, e continuare con la query.
In ogni caso, io sono ancora un po 'inesperto con Java, quindi se la mia comprensione di questo non è corretto, per favore fatemelo sapere nei commenti.