gpt4 book ai didi

java - 带有 PipedOutputStream 的 System.setOut

转载 作者:行者123 更新时间:2023-11-30 07:12:36 28 4
gpt4 key购买 nike

我已经使用 JTextArea 开发了一个小型控制台。我阅读了一些教程并了解了一些东西。但我仍然有问题。这是我的代码。

public class Console extends JFrame {

public Console() throws IOException {
setSize(492, 325);
setLayout(new BorderLayout());
setDefaultCloseOperation(3);
setVisible(true);

final JTextArea area = new JTextArea();
add(area, BorderLayout.CENTER);

JButton button = new JButton("test");
add(button, BorderLayout.EAST);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Test with Button Click.."); // this is not print in textarea.
}
});

final PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
System.out.println("Test Before setOut.");
System.setOut(new PrintStream(pos, true));

System.out.println("Test After setOut."); // this is printed in my textarea.
new SwingWorker<Void, String>() {
@Override
protected Void doInBackground() throws Exception {
Scanner scan = new Scanner(pis);
while (scan.hasNextLine())
area.append(scan.nextLine());
return null;
}

}.execute();

}

public static void main(String[] args) throws Exception {
new Console();
}
}

这是我的输出..
Output

当按钮被点击时,System.out.println 不能与 textarea 一起工作。我不知道我做错了什么。

最佳答案

当您调用 SwingWorker.execute() 时,它只会运行一次。所以在这里,它读取第一个 println(),到达文档末尾,然后停止运行。

更好的解决方案是实现您自己的 OutputStream 并将其 write() 方法附加到文本区域,使用 SwingUtilities.invokeLater() 以确保这是在 AWT 线程上完成的。

大致是这样的:

class TextAreaOut extends OutputStream implements Runnable {
JTextArea text;
String buffer = "";

TextAreaOut(JTextArea text) {
this.text = text;
System.setOut(new PrintStream(this));
}

@Override
public synchronized void run() {
text.append(buffer);
buffer = "";
}

@Override
public synchronized void write(int b) throws IOException {
if(buffer.length() == 0) {
SwingUtilities.invokeLater(this);
}
buffer += (char)b;
}
}

关于java - 带有 PipedOutputStream 的 System.setOut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20246347/

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