Comment configurer le bouton Java par défaut pour réagir sur la touche ENTRÉE _released_?
Dans mon application j'utilise un bouton par Défaut. Je veux qu'il réagir quand ENTER
Clé est publié. Pas quand ENTER
Clé est pressé.
J'ai enlevé le KeyStroke
de InputMap
du bouton. Mais il ne fonctionne pas pour moi. Comment dois-je faire?
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class ButtonTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
buildFrame();
}
});
}
private static void buildFrame() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton button = new JButton(new AbstractAction("Button") {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ButtonTest::actionPerformed: CALLED");
}
});
JButton button2 = new JButton("Button 2");
InputMap im = button.getInputMap();
im.put(KeyStroke.getKeyStroke("ENTER"), "none");
im.put(KeyStroke.getKeyStroke("released ENTER"), "released");
f.setLayout(new GridBagLayout());
f.add(button);
f.add(button2);
f.getRootPane().setDefaultButton(button);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
C'est l'exemple de code.
source d'informationauteur Hirantha
Vous devez vous connecter pour publier un commentaire.
les touches pour le bouton par défaut (c'est le bouton qui est déclenchée lors de l'entrée, n'importe quel composant est focusOwner) sont liés à la rootPane de componentInputMap, c'est son inputMap de type WHEN_IN_FOCUSED_WINDOW. Donc, techniquement, c'est l'endroit à modifier:
Méfiez-vous: c'est encore différent de la enfoncée/relâchée comportement d'un non-bouton par défaut parce que le rootPane action appelez simplement du bouton.doClick sans passer par les mouvements de l'armement/en appuyant sur la buttonModel indirectement déclencher l'action.
L'effet de ceci est que le bouton exécute ses actionPerformed seule fois, lorsque l'ENTRÉE est sorti (si je comprends bien, c'est ce que vous voulez).
EDIT: l'exécution de code suivant montre que la actionPerformed est exécutée seulement à ENTRER dans libération (bien que visuellement le bouton apparaît enfoncé déjà sur ENTER appuyez sur)
Vous pouvez utiliser la version de
getKeyStroke()
qui vous permet de définironKeyRelease
àtrue
comme dans cette réponseEdit: Vous pouvez arrêter de répétitions, comme dans ce réponse.