gpt4 book ai didi

java - KeyListener 中出现意外的 StackOverflowError

转载 作者:行者123 更新时间:2023-11-29 09:08:52 25 4
gpt4 key购买 nike

我正在编写一个程序,可以将用于复习的问题集写入一个文件,供另一个程序读取。可能的答案被输入到底部的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com