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
}