实现keylistener和jpanel

时间:2017-11-01 17:24:32

标签: java multithreading swing

我正在尝试创建两个线程,其中一个使用keylistener和pipedoutputstream来为另一个线程(pipedinputstream)提供输入。我实现它的方式:Main中的两个Runnable类,main(String [] args)使用ExecutorService来控制这两个线程。由于对如何使用其中一些类很少了解,我几乎没有提出如下内容(跳过一些代码):

public class Main {

final static PipedOutputStream pipedOut = new PipedOutputStream();
final static PipedInputStream pipedIn = new PipedInputStream();

class ListenerOutput extends JPanel implements KeyListener, Runnable {
    int eventKey;
    char c;

    ListenerOutput() {
        this.setPreferredSize(new Dimension(500, 500));
        addKeyListener(this);

        JFrame f = new JFrame();
        f.getContentPane().add(new ListenerOutput());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

    @Override
    {...}
}

class GameLoop implements Runnable {...}

main(String[] args){
    try {
        pipedOut.connect(pipedIn);
    } catch (IOException e) {
        e.printStackTrace();
    }

    ExecutorService service = Executors.newFixedThreadPool(2);
    service.execute(new Main().new ListenerOutput());
    service.execute(new Main().new GameLoop());
}

问题在于f.getContentPane().add(new ListenerOutput());行。它是递归的,没有尽头。我知道它会抛出StackOverflow错误。但是,我仍然很困惑该做什么。提前谢谢!

1 个答案:

答案 0 :(得分:2)

从构造函数中,该行提供了一个提示:

addKeyListener(this);

避免递归:

// f.getContentPane().add(new ListenerOutput());
f.getContentPane().add(this);

因此JFrame f使用与KeyListener类似的构造对象。