processKeyEvent中的堆栈溢出

时间:2009-12-12 16:21:42

标签: java user-interface stack

我正在与一个我不太了解的错误作斗争。 我有一个Java类,我们称它为DownloadTable派生的JDTable。 这些类中的每一个都实现KeyListener

我希望基类JDTable能够处理一些键击,所以我将this.AddListener(this)放在其构造函数中并创建一个键处理程序

  

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

然后我希望派生类DownloadTable自己做一些特殊的键盘处理,所以我重复这个过程并在那里添加键盘处理程序。 我还从派生类的键处理程序中添加了对super.processKeyEvent()的调用,以将派生的处理程序和基本处理程序连接在一起。

问题是它没有按预期工作,并且每当调用super.ProcessKeyEvent时我都会遇到堆栈溢出异常。在调试器中运行时,甚至不会调用父级的事件处理程序。我错过了一些明显的东西吗是不是super.processKeyEvent()会以某种方式调用超类'keyPressed()处理程序?感谢。

附加堆栈:

  

线程“AWT-EventQueue-1”java.lang.StackOverflowError中的异常       在jd.gui.swing.jdgui.views.downloadview.DownloadTable.keyPressed(DownloadTable.java:253)       at java.awt.Component.processKeyEvent(Unknown Source)       在javax.swing.JComponent.processKeyEvent(未知来源)       在jd.gui.swing.jdgui.views.downloadview.DownloadTable.keyPressed(DownloadTable.java:253)       at java.awt.Component.processKeyEvent(Unknown Source)       在javax.swing.JComponent.processKeyEvent(未知来源)       在jd.gui.swing.jdgui.views.downloadview.DownloadTable.keyPressed(DownloadTable.java:253)       在java.awt.Component.processKeyEvent(未知来源)

3 个答案:

答案 0 :(得分:1)

processKeyEvent()调用已注册的侦听器传播键事件时,侦听器不应回调processKeyEvent()或结果是无限递归,如您所见。

您添加通话的原因是什么?你删除它的时候有什么用吗?

答案 1 :(得分:1)

  

我想要基类JDTable   处理一些击键

您不应该重写processKeyEvent()。您应该使用Key Bindings。提供的链接显示每个Swing组件的现有绑定,并提供指向“使用键绑定”的Swing教程的链接。

答案 2 :(得分:1)

感谢您的回复,所有这些都是正确的。

显然我已经找到了问题所在。我混淆了awt的processKeyEvent()KeyListener

对此的正确解决方案是添加

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

到基本方法。现在正在处理基本方法和派生方法中的事件。

然而,奇怪的是,KeyAdapter对我有用,而KeyListener却没有。什么不起作用的是当我创建基类实现KeyListener并添加方法public void keyPressed(KeyEvent e) { ... }时 - 它永远不会被调用。如上所述,当我使用KeyAdapter内联时,它会被执行。