2017-06-25 6 views
0

J'ai créé une jframe et j'ai ajouté un bouton qui, après avoir été cliqué, vous demande d'appuyer sur n'importe quel bouton, qui s'affiche également sur le bouton.
(ses affichages devraient aller comme ceci -> "Click Me" -> "Pressez n'importe quel bouton" -> "barre d'espace")
Mon problème n ° 1 est que, je ne veux pas aller de "Click Me" à "Appuyez sur n'importe quel bouton" en appuyant sur la barre d'espace.
Et mon problème n ° 2 est que, quand je suis à "Press Any Button" et j'appuie sur la barre d'espace, à la libération, il revient à "Press Any Button" au lieu de rester à "Space Bar".
Voici mon code.Comment empêcher la barre d'espace de déclencher l'effet de clic sur un bouton?

public class Test { 

/** 
* @param args the command line arguments 
*/ 

static class starton implements ActionListener { 
    private JButton button; 
    private JFrame frame; 

    public starton(JButton button, JFrame frame) { 
     this.button = button; 
     this.frame = frame; 
    } 

    public void actionPerformed(ActionEvent e) { 
     button.setText("Press A Button"); 
     button.setSize(button.getPreferredSize()); 
     button.addKeyListener(
     new KeyListener() { 
      @Override 
      public void keyPressed(KeyEvent e){ 
       String text = null; 

        char a = e.getKeyChar(); 
        text = ""+a+""; 
        if (a == ' '){ 
         text = "Space Bar"; 
        } 

       button.setText(""+text+""); 
       button.setSize(button.getPreferredSize()); 
       button.removeKeyListener(this); 
      } 

      @Override 
      public void keyTyped(KeyEvent e) { 
      } 

      @Override 
      public void keyReleased(KeyEvent ke) { 
      } 
     }); 
    } 
} 

public static void main(String[] args) throws IOException { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    double width = screenSize.getWidth(); 
    double height = screenSize.getHeight(); 
    int frame1w = 600; 
    int frame1h = 400; 

    JFrame frame1 = new JFrame("Foo"); 
    frame1.setSize(frame1w, frame1h); 
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel contentPane = new JPanel(); 
    contentPane.setBackground(Color.WHITE); 
    contentPane.setLayout(null); 
    frame1.setContentPane(contentPane); 

    JButton button1 = new JButton("Click Me"); 
     button1.setSize(button1.getPreferredSize()); 
     button1.addActionListener(new starton(button1, frame1)); 
      // add more code here 
     contentPane.add(button1); 
     frame1.setVisible(true); 
} 

}

Répondre

0

Le problème se réalise en raison de votre contrôle imbriqué du KeyListener au sein de l'auditeur d'action. Depuis Space Bar est le bouton par défaut du clavier pour l'équivalent de cliquant sur le bouton, chaque fois que vous appuyez sur Space BaractionPerformed méthode des boutons ActionListener est tiré. Vous pouvez voir cela se produire si vous obtenez le actionCommand du ActionEvent tiré et l'impression. Vous pouvez également utiliser ceci pour contrôler quel code est exécuté. Comme ceci:

public void actionPerformed(ActionEvent e) 
{ 
    System.out.println("Button Action: " + e.getActionCommand()); 
    if(e.getActionCommand().equals("Click Me")) 
    { 
     //Your existing code but remove this line 
     //button.removeKeyListener(this); 
    } 
} 
2

Le JButton installe une série de raccourcis clavier pour contrôler l'entrée d'utilisateur

Vous pouvez vérifier ce que ces derniers utilisent des quelque chose comme ...

JButton btn = new JButton("Test"); 
InputMap im = btn.getInputMap(); 
for (KeyStroke ik : im.allKeys()) { 
    System.out.println(ik + " = " + im.get(ik)); 
} 

Sur mon système, imprime

pressed SPACE = pressed 
released SPACE = released 

Cela me dit que le Espace clé est liée aux touches d'action pressed et released

Pour désactiver ces touches, vous devez fournir votre propre liaison ...

Action blankAction = new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
    } 
}; 

ActionMap am = btn.getActionMap(); 
am.put("pressed", blankAction); 
am.put("released", blankAction); 

Cette remplace simplement les liaisons pressed et released avec un vide Action qui ne fait rien.Maintenant, un mot d'avertissement - les raccourcis clavier peuvent être différents sur différentes plateformes/regarder et sentir; Vous devez aussi prendre garde que les utilisateurs ont souvent une attente prédéfinie de ce que certains contrôles peuvent et ne peuvent pas faire, les changer auront une incidence sur la façon dont ils réagissent à vous programmer

Quant à votre deuxième problème, le button utilise toujours le même ActionListener vous vous êtes inscrit, donc chaque fois que vous appuyez sur espace, il déclenche la ActionListener à nouveau, et l'ajout d'une nouvelle KeyListener qui va aggraver vos problèmes

soit vous souhaitez utiliser un ActionListener séparé pour les deux boutons ou que vous voulez pour retirer le ActionListener du bouton quand il est d'abord déclenché - Je voudrais aller pour la seconde, c'est plus facile o comprendre le code

non, je veux dire, si je désactive la "presse" pour la barre d'espace, serais-je en mesure d'appuyer sur quand je suis à "Appuyez sur un bouton"?

La solution la plus simple serait d'utiliser deux touches différentes, l'une avec un ActionListener qui a mis en place l'autre bouton, qui avait un KeyListener attaché.

Si, pour une raison quelconque vous « vraiment » ne veulent pas faire cela, alors vous devez retirer le ActionListener du bouton quand il est d'abord déclenché

static class starton implements ActionListener { 

    //... 

    public void actionPerformed(ActionEvent e) { 
     button.setText("Press A Button"); 
     button.setSize(button.getPreferredSize()); 
     button.addKeyListener(...); 
     button.removeActionListener(this); 
    } 
} 
+0

sur le Premier1, pourquoi je veux désactiver le "pressé" pour la barre d'espace? n'est-ce pas censé être le point entier? je veux dire appuyer sur la barre d'espace? aussi je n'ai pas multiplue les boutons, c'est juste 1 .. aussi sur le deuxième problème, j'ai essayé d'enlever avec succès l'écouteur d'action mais je veux pouvoir faire la routine autant de fois que je veux, pas juste une fois –

+0

a pris votre question entière comme * "Comment arrêter la barre d'espace de déclencher l'effet de clic sur un bouton? *" et * "je ne veux pas passer de" Click Me "à" Appuyez sur n'importe quel bouton "en appuyant sur la barre d'espace. vous vouliez désactiver la fonctionnalité de la barre [Espace] pour le bouton. * "aussi je n'ai pas de boutons multiples, c'est juste 1" * - Oui, et c'est vous le problème "de base"; – MadProgrammer

+0

* "J'ai essayé de retirer avec succès l'écouteur d'action mais je veux être capable de faire la routine autant de fois que je le veux, pas seulement une fois" * Et? Encore une fois, deux boutons aideraient à résoudre la plupart des problèmes que vous rencontrez. Vous pouvez simplement les échanger en place comme vous le souhaitez. Parce que vous avez à la fois un 'KeyListener' et un' ActionListener' enregistrés sur le bouton, chaque fois que vous appuyez sur [Espace], ils seront tous deux déclenchés, à mon avis, vous demandez simplement des problèmes qui seront plus faciles à résoudre en utilisant deux (ou plus) boutons, chacun avec leurs propres fonctionnalités ciblées – MadProgrammer