2009-12-12 3 views
0

Je me bats une erreur que je ne comprends pas bien. J'ai une classe en Java, appelons-la DownloadTable dérivée d'un JDTable. Chacune de ces classes implémente KeyListener.débordement de pile dans swing à processKeyEvent

Je voudrais la classe de base JDTable pour gérer certaines touches, donc je mets this.AddListener(this) dans son constructeur et crée un gestionnaire clé

public void keyPressed (KeyEvent e) {...}

Ensuite, j'aimerais que la classe dérivée DownloadTable fasse son propre traitement de clavier, donc je répète le processus et j'y ajoute également un gestionnaire de clavier. J'ai également ajouté un appel à super.processKeyEvent() à partir du gestionnaire de clés de la classe dérivée pour relier le gestionnaire dérivé et le gestionnaire de base.

Le problème est que cela ne fonctionne pas comme prévu et j'obtiens une exception de débordement de pile chaque fois que super.ProcessKeyEvent est appelée. Lorsqu'il est exécuté dans le débogueur, le gestionnaire d'événements du parent n'est même pas appelé. Est-ce que je manque quelque chose d'évident? Le super.processKeyEvent() ne va-t-il pas invoquer le gestionnaire keyPressed() de la superclasse? Merci.

pile ci-joint:

Exception in thread "AWT-EventQueue-1" java.lang.StackOverflowError à jd.gui.swing.jdgui.views.downloadview.DownloadTable.keyPressed (DownloadTable.java: 253) at java.awt.Component.processKeyEvent (source inconnue) à javax.swing.JComponent.processKeyEvent (source inconnue) à jd.gui.swing.jdgui.views.downloadview.DownloadTable.keyPressed (DownloadTable.java: 253) at java.awt.Component.processKeyEvent (source inconnue) at javax.swing.JComponent.processKeyEvent (source inconnue) à jd.gui.swing.jdgui.views.downloadview.DownloadTable.keyPressed (DownloadTable.java:253) à java.awt.Component.processKeyEvent (Source inconnue)

+0

Afficher le contenu de la méthode DownloadTable.keyPressed. –

Répondre

1

Merci pour les réponses, toutes sont correctes.

Apparemment, j'ai compris le problème. J'ai mélangé awt's processKeyEvent() et KeyListener.

La solution appropriée à c'était d'ajouter

this.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyPressed(KeyEvent e) { ... 

la méthode de base. Maintenant, les événements dans les méthodes de base et dérivés sont gérés.

Pourtant, la chose étrange est que KeyAdapter fonctionne pour moi et KeyListener ne fonctionne pas. Ce qui ne marche pas, c'est quand je mets en œuvre la classe de base KeyListener et que j'ajoute la méthode public void keyPressed(KeyEvent e) { ... } - elle n'est jamais appelée. Comme je l'ai dit plus haut, quand j'utilise KeyAdapter en ligne, il est exécuté.

1

Lorsque processKeyEvent() appelle les auditeurs inscrits à propager des événements clés, un écouteur ne devrait pas rappeler processKeyEvent() ou le résultat est une récursion infinie comme vous avez vu.

Pour quelle raison avez-vous ajouté l'appel? Est-ce que quelque chose ne fonctionne pas lorsque vous l'enlevez?

1

J'aimerais la classe de base JDTable à gérer certaines touches

Vous ne devriez pas être surchargez la processKeyEvent(). Vous devriez utiliser Key Bindings. Le lien fourni vous montre les liens existants pour chaque composant Swing et fournit un lien vers le didacticiel Swing sur "Utilisation des liaisons de touches".

Questions connexes