我正在与一个我不太了解的错误作斗争。
我有一个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(未知来源)
答案 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
内联时,它会被执行。