java - KeyListener 中出现意外的 StackOverflowError

标签 java swing keylistener event-listener stack-overflow

我正在编写一个程序,可以将用于复习的问题集写入一个文件,供另一个程序读取。可能的答案被输入到底部的 JTextFields 中。它有代码确保最后不会出现超过一个空白的 JTextField。当我输入答案时,它会在不同点抛出 StackOverflowError。

堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:232)
    at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:232)
    at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:232)
    at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:232)

和代码:现在缩短了!!!

package writer;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MyPanel extends JPanel implements KeyListener
{
    private MutableQuestion current;
    private WriterPanel writer;
    private JPanel top=new JPanel(new BorderLayout()),answerPanel=new JPanel(new GridLayout(0,1));
    private JSplitPane split;
    private JTextField title=new JTextField();
    private JTextArea question=new JTextArea();
    private ArrayList<JTextField> answers=new ArrayList<JTextField>();
    public MyPanel()
    {
    super(new BorderLayout());
        this.add(title,BorderLayout.PAGE_START);
        split=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,new JScrollPane(question),new JScrollPane(answerPanel));
    split.setDividerLocation(150);
    this.add(split,BorderLayout.CENTER);
    answers.add(new JTextField());
    answerPanel.add(answers.get(0));
    answers.get(0).addKeyListener(this);
}
private void back(){}
private void fitTitle(){}
private void fixAnswers()
{
    //System.out.println(answers);
    while(answers.get(answers.size()-1).getText().equals("")&&answers.size()>1&&answers.get(answers.size()-2).getText().equals(""))
        removeAnswer(answers.size()-1);
    if(!answers.get(answers.size()-1).getText().equals(""))
    {
        answers.add(new JTextField());
        answerPanel.add(answers.get(answers.size()-1));
        answers.get(answers.size()-2).removeKeyListener(this);
        //answers.get(answers.size()-1);
        answerPanel.revalidate();
    }
    answers.get(answers.size()-1).addKeyListener(this);
}
private void removeAnswer(int i){}
public void keyTyped(KeyEvent e) 
{
    fixAnswers();
}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public void newQuestion(){}
public void loadQuestion(int i){}
public void saveQuestion(){}
public void loadQuestion(MutableQuestion q){}
public static void main(String[] args)
{
    JFrame j=new JFrame();
    j.setSize(600,600);
    j.add(new MyPanel());
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    j.setVisible(true);
}

最佳答案

每次您键入一个键时,都会调用您的初始监听器 (this') keyTyped 方法,该方法调用 fixAnswers,并且作为最后一步,它会向您的 JTextField 添加另一个监听器。您永远不会删除任何监听器,因此最终您会得到比 Java 堆栈可以处理的更长的监听器字符串。

您只需要一个监听器。不要继续添加它们,我怀疑你的问题会消失。

关于java - KeyListener 中出现意外的 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435516/

相关文章:

java - Glassfish v3 "unable to find valid certification path to requested target"

java - 使用 NetBeans 11.0 填充 Java JFrame 应用程序的速度缓慢

java - Netbeans 中的灰屏

java |按键监听器 |基本的

java - 如果我在 JFrame 内的任何地方按 escape(不仅仅是在特定的文本框等;),如何关闭 JFrame ?

java - Windows 8.1 上的磁带机目录路径

Java Applet init 非常慢 - java 1.8。 u60

java - 如果一个线程改变并发集合之一中已有的对象,可以提供什么保证?

java - 如何不仅从 JTabbedPane 中删除 JPanel,而且还优雅地处置 JPanel 实例?

java - 更新复杂 JTable、TableModel 等的正确方法