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?

È stato utile?

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 NumberFormatExceptions, 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top