Question

Tout d'abord, pour faire mon travail en expliquant un peu plus facile, voici une partie de mon code:

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

Comme vous pouvez le voir, je suis arrivé jusque-là. Et en effet, quand je tape une valeur dans la composante du champ de texte de la fileuse (JFormattedTextField), puis appuyez sur puis appuyez sur Entrée, cela fonctionne.

Ce que je veux maintenant être en mesure d'avoir le champ de texte à répondre ENTRER sans avoir à saisir manuellement une nouvelle valeur (ce qui va à l'encontre sorta le but de faire une fileuse sortir). Comment puis-je faire?

Était-ce utile?

La solution

Je sais que ce n'est pas l'auditeur d'action ... mais peut-être cela peut travailler pour vous?


    text.addKeyListener( new KeyAdapter() {
            @Override
            public void keyReleased( final KeyEvent e ) {
                if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
                    System.out.println( "enter pressed" );
                }
            }
        } );

Autres conseils

Je viens de tombé sur une question relative à cela, moi-même. Dans mon cas, j'avais un JSpinner avec une configuration de SpinnerNumberModel pour que je puisse entrer des valeurs d'identité numériques, puis les récupérer à partir d'une base de données distante. Cela a fonctionné très bien avec un JButton comme mon déclencheur pour la requête, mais je voulais être en mesure de basculer le focus sur le terrain via l'onglet, et appuyez sur Entrée, et aussi être en mesure de changer la valeur en entrant un ID avec les touches numériques , puis appuyez sur Entrée.

Celui qui me donnait la plupart des questions entrait manuellement l'ID avec les touches numériques, puis appuyez sur Entrée. Quand je le faire, la question serait encore arriver, mais il était l'interrogation ID précédente plutôt que celui que je viens entré, donc je dois frapper à nouveau entrer pour interroger le nouvel ID (voir code)

((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            queryData();
        }
    }
});

et la méthode de recherche:

private void queryData() {
    int minVal = Integer.parseInt(minRng.getValue().toString());
    queryDataBase(minVal);
}

Pour corriger cela, tout ce que je devais faire était forcer la requête à attendre pour courir jusqu'à la fileuse mis à jour sa valeur, qui a été facilement fait en utilisant SwingUtilities.invokeLater() pour le forcer à la fin de la file d'attente EDT, comme ceci:

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

Merci à invokeLater() la requête arrive maintenant sur la nouvelle valeur plutôt que le précédent, lorsque vous appuyez sur entrer, comme JSpinner a ensuite mis à jour sa valeur à une nouvelle entrée.

Je suppose que la raison est que la valeur saisie est pas officiellement appliquée à la JSpinner jusqu'à ce que vous appuyez sur Entrée, ce qui déclenche également l'auditeur clé pour la requête. Le KeyEvent pour l'auditeur clé personnalisée [requête] semble être le premier dans la file d'attente, il exécute son code d'abord, puis la KeyEvent pour appliquer la valeur à la JSpinner du JFormattedTextField interne, ce qui est la raison pour laquelle il interroge l'ancien valeur. SwingUtilities.invokeLater() met juste la requête elle-même à la fin de la file d'attente, il permet à l'autre KeyEvent de terminer son code avant d'exécuter la requête.

Modifier

Une autre façon d'y parvenir est de demander directement la valeur de la JFormattedTextField plutôt que le JSpinner, comme cela devrait aussi retourner la nouvelle valeur entrée depuis la JFormattedTextField contient la valeur que vous avez saisi, mais il n'a pas encore été transmis à le JSpinner, qui semble être là où se situe le problème.

private void queryData() {
    JFormattedTextField tf = ((JSpinner.DefaultEditor) minRng.getEditor()).getTextField();
    int minVal = Integer.parseInt(tf.getText());
    queryDataBase(minVal);
}

Le seul problème avec cette méthode est que vous devez alors prendre des NumberFormatExceptions, lors de l'analyse de la valeur, où l'approche SwingUtilities.invokeLater() permet au modèle de spinner pour éliminer les caractères non valides, automatiquement, et poursuivre la requête.

Quoi qu'il en soit, je suis encore un peu inexpérimenté avec Java, donc si ma compréhension de ce qui est faux, s'il vous plaît laissez-moi savoir dans les commentaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top