Java 按键上的StackOverflower错误已释放,但mouseReleased工作正常
使用鼠标进行选择工作正常,如以下运行时日志所示:Java 按键上的StackOverflower错误已释放,但mouseReleased工作正常,java,swing,stack-overflow,keylistener,Java,Swing,Stack Overflow,Keylistener,使用鼠标进行选择工作正常,如以下运行时日志所示: init: Deleting: /home/thufir/NetBeansProjects/gnumail-providers/build/built-jar.properties deps-jar: Updating property file: /home/thufir/NetBeansProjects/gnumail-providers/build/built-jar.properties compile: run: Mar 30, 201
init:
Deleting: /home/thufir/NetBeansProjects/gnumail-providers/build/built-jar.properties
deps-jar:
Updating property file: /home/thufir/NetBeansProjects/gnumail-providers/build/built-jar.properties
compile:
run:
Mar 30, 2013 10:16:36 PM net.bounceme.dur.nntp.swing.ArticlesPanel itemSelected
INFO: selected item 8
Mar 30, 2013 10:16:39 PM net.bounceme.dur.nntp.swing.ArticlesPanel itemSelected
INFO: selected item 1
Mar 30, 2013 10:16:41 PM net.bounceme.dur.nntp.swing.ArticlesPanel itemSelected
INFO: selected item 5
Mar 30, 2013 10:16:42 PM net.bounceme.dur.nntp.swing.ArticlesPanel itemSelected
INFO: selected item 3
Mar 30, 2013 10:16:44 PM net.bounceme.dur.nntp.swing.ArticlesPanel itemSelected
INFO: selected item 7
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at net.bounceme.dur.nntp.swing.ArticlesPanel$2.keyReleased(ArticlesPanel.java:49)
at net.bounceme.dur.nntp.swing.ArticlesPanel$2.keyReleased(ArticlesPanel.java:49)
at net.bounceme.dur.nntp.swing.ArticlesPanel$2.keyReleased(ArticlesPanel.java:49)
at net.bounceme.dur.nntp.swing.ArticlesPanel$2.keyReleased(ArticlesPanel.java:49)
at net.bounceme.dur.nntp.swing.ArticlesPanel$2.keyReleased(ArticlesPanel.java:49)
但是,当按键和鼠标选择都调用(或应该调用)相同的方法时,为什么用键盘箭头选择会导致StackOverflowError
相关类别:
package net.bounceme.dur.nntp.swing;
import gnu.mail.providers.nntp.GroupMetaData;
import java.util.List;
import java.util.logging.Logger;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import net.bounceme.dur.nntp.gnu.PMD;
import net.bounceme.dur.nntp.gnu.Page;
import net.bounceme.dur.nntp.gnu.Usenet;
public class ArticlesPanel extends JPanel {
private static final Logger LOG = Logger.getLogger(ArticlesPanel.class.getName());
private static final long serialVersionUID = 1L;
private JList<String> jList = new JList<>();
private JScrollPane scrollPane = new JScrollPane();
private DefaultListModel<String> dlm;
public ArticlesPanel() throws MessagingException {
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
setLayout(new java.awt.BorderLayout());
dlm = new DefaultListModel<>();
for (int i = 1; i < 9; i++) {
dlm.addElement("item\t\t" + i);
}
jList.setModel(dlm);
jList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jList.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
mouseReleases(evt);
}
});
jList.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
keyReleased(evt);
}
});
scrollPane.setViewportView(jList);
add(scrollPane, java.awt.BorderLayout.CENTER);
this.setSize(300, 100);
this.setVisible(true);
}
private void keyReleased(java.awt.event.KeyEvent evt) {
itemSelected();
}
private void mouseReleases(java.awt.event.MouseEvent evt) {
itemSelected();
}
private void itemSelected() {
LOG.info("selected\t\t" + jList.getSelectedValue());
}
}
您在
keyereleased(evt)
调用中得到一个stackoverflowerrror
,因为KeyAdapter
中的方法将该方法隐藏在ArticlesPanel
中。结果是无限递归:
public void keyReleased(java.awt.event.KeyEvent evt) {
keyReleased(evt); // calling this same method again
}
这不会发生在您的mouseReleases
调用中,因为您自己的方法被调用为mouseReleases
(注意s
)
您在
keyereleased(evt)
调用中得到一个stackoverflowerrror
,因为KeyAdapter
中的方法将该方法隐藏在ArticlesPanel
中。结果是无限递归:
public void keyReleased(java.awt.event.KeyEvent evt) {
keyReleased(evt); // calling this same method again
}
这不会发生在您的mouseReleases
调用中,因为您自己的方法被调用为mouseReleases
(注意s
)
@djechlin其他人会的,你的URL没有任何地方。顺便说一句@djechlin其他人会的,你的URL没有任何地方。你的答案似乎很清楚,但很难在原始代码中发现!再次感谢。你的答案似乎很清楚,但在原始代码中很难发现!再次感谢。
public void mouseReleased(java.awt.event.MouseEvent evt) {
mouseReleases(evt); // calling the method in the outer class
}