KeyListener dans Textfield qui ne se déclenche pas lorsque vous appuyez sur entrée
Je suis en train de faire un programme qui convertit les degrés fahrenheit en celsius en java. Dans le programme, j'ai 2 Étiquettes et 1 TextField pour l'entrée. Je souhaite faire convertir la température lorsque l'utilisateur des types de la température et de presses Entrée. Pour ce faire, j'ai ajouté un écouteur de mon textfield mais ça ne fonctionne pas. Lorsque j'appuie sur Entrée auditeur de ne pas tirer.
Et voici mon code.
public class TempConv extends JFrame{
private JLabel info;
private JLabel result;
private JTextField input;
private String outcome;
public TempConv(){
super("Temperature Converter");
setLayout(new BorderLayout());
info = new JLabel("Enter Fahrenheit Temperature");
add(info, BorderLayout.NORTH);
input = new JTextField(12);
add(input, BorderLayout.CENTER);
result = new JLabel("Temperature in Celcius is: " + outcome);
add(result, BorderLayout.SOUTH);
input.addKeyListener(
new KeyListener(){
public void keyPressed(KeyEvent e){
if(e.getKeyChar() == KeyEvent.VK_ENTER){
outcome = input.getText();
}
}
}
);
}
public static void main(String[] args) {
TempConv ftc = new TempConv();
ftc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ftc.setLocationRelativeTo(null);
ftc.setSize(370, 100);
ftc.setVisible(true);
}
}
Edit: Il fonctionne avec ActionListener mais j'ai besoin de le faire avec une classe anonyme. Sans classe anonyme il tire avec Entrée.
L'événement est consommé plus haut dans la chaîne d'événements, il est donc jamais arriver à vous, il vaut mieux utiliser raccourcis clavier - Effectivement, il est préférable d'utiliser un
J'ai été tenté d'utiliser l'action de l'auditeur. Tout allait si bien jusqu'à ce que je ne trouve pas comment vérifier si la touche entrée est pressée ou pas dans ActionListener.
Est-il question? À partir d'une plate-forme indépendante de point de vue, la
", ai-je tort?" Oui..et non.
Hmm.. je obtenir votre point de vue. Je vais me concentrer sur ActionListener ensuite.
ActionListener
pour ce que vous êtes en train de faire - c'est ce qu'il est destiné - souvenez-vous, [Enter] n'est pas toujours la touche "j'accepte" pour chaque plate-forme 😉J'ai été tenté d'utiliser l'action de l'auditeur. Tout allait si bien jusqu'à ce que je ne trouve pas comment vérifier si la touche entrée est pressée ou pas dans ActionListener.
Est-il question? À partir d'une plate-forme indépendante de point de vue, la
ActionListener
sera déclenché lorsque l'utilisateur déclenche la "accepter" action pour cette plate-forme. Il se trouve que pour la plupart des plates-formes, c'est la touche [Enter].", ai-je tort?" Oui..et non.
KeyListener
est à un niveau faible, une API pour ce que vous essayez d'atteindre. Si vous voulez VRAIMENT pour surveiller la touche [Enter], alors vous allez avoir à remplacer la clé de liaison commencer utilisée par le champ de texte. Toutefois, cette situation va changer la façon dont l'application peut fonctionner sur d'autres plates-formes, d'où la raison pour la ActionListener
. Cela permet à l'aspect et la convivialité de décider sous quelles conditions la ActionListener
est déclenché. Dans la plupart des plates-formes, c'est la touche [Enter]...Hmm.. je obtenir votre point de vue. Je vais me concentrer sur ActionListener ensuite.
OriginalL'auteur Miral | 2013-01-13
Vous devez vous connecter pour publier un commentaire.
Essayez d'e.getKeyCode() à la place de l'e.getKeyChar(). La constante KeyEvent.VK_ENTER est un int, pas un char.
En d'autres termes:
au lieu de
C'est vrai, bien que je suppose qu'ils sont de juger si oui ou non l'auditeur feux, sur l'opportunité ou non de l'instruction if provoque effectivement une sortie à être imprimé. Peut-être que je n'aurais pas fait une telle hypothèse...
Oui, j'ai essayé ça aussi, mais il n'a pas travaillé.
Comme je l'ai dit, la suggestion du contraire et qu'on les OP devraient prendre en considération future, juste ne va pas aider dans cette situation, désolé
OriginalL'auteur Sinkingpoint
Réponse tardive, mais j'ai essayé avec le code dans la question et la KeyPressed a un déclencheur, mais parce que le JLabel n'ai pas de mise à jour, vous avez assumé la KeyEvent n'a pas tiré.
Juste après
ajouter
si l'étiquette est mise à jour automatiquement.
OriginalL'auteur user3227998
Boutons n'ont pas besoin d'un
KeyListener
(et pour la plupart ne devriez pas les utiliser), ils utilisent unActionListener
pour répondre à tous les événements d'activation, y compris Entrée, les clics de souris et les raccourcis clavier, c'est beaucoup plus simplifiée de l'API.Voir Comment Utiliser les Boutons, les Cases à Cocher et des Boutons Radio, Comment Écrire une Action Auditeurs et Comment Utiliser des Actions pour plus de détails
Vous pouvez également définir un bouton que le bouton "par défaut" qui peut être activé lorsqu'il n'est pas concentré (à condition que le concentre actuellement composant ne pas utiliser/consommer de l' Entrée clé)
Voir
JRootPane#setDefaultButton
et Comment Utiliser la Racine de Volets pour plus de détailsOriginalL'auteur MadProgrammer
Tout d'abord, vous avez besoin de mettre en œuvre toutes les méthodes de KeyListener. Vous n'avez pas mis en œuvre keyTyped et keyReleased. Une autre chose est, vous devriez vérifier le code de la clé au lieu d'un char, car le "Enter", le char n'est pas visible, donc de préférence, vous devriez vérifier si le code de la clé est égale à KeyEvent.VK_ENTER. La dernière chose, c'est quand vous appuyez sur entrée, vous mettre à jour le résultat de Chaîne variable, mais vous ne le montrent pas n'importe où, de sorte que vous besoin de mettre le texte sur le résultat JLabel. Vous avez aussi oublié de faire la conversion. Mon explication pourrait être déroutant, mais ci-dessous le code:
OriginalL'auteur Jesus Flores