Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打印控制台到JFrame TextArea-行为怪异(闪烁屏幕)_Java_Swing_Console_System.out_Printstream - Fatal编程技术网

Java 打印控制台到JFrame TextArea-行为怪异(闪烁屏幕)

Java 打印控制台到JFrame TextArea-行为怪异(闪烁屏幕),java,swing,console,system.out,printstream,Java,Swing,Console,System.out,Printstream,我有一个在控制台中逐行打印数字的项目,我成功地将其重定向到我用于此应用程序的GUI Jframe。然而,当数字被打印到文本区域时,它们并不像滚动列表那样一个接一个地显示出来。相反,我看到整个文本区域一次又一次地闪烁和打印。一旦阅读完成,文本区域中的所有内容看起来都是正确的。有没有一种方法可以正确设置它,使它像我在控制台中看到的那样打印得很好 非常感谢您的帮助 对于system.out的重定向,我有以下代码: package ibanchecker03; import java.io.IOExc

我有一个在控制台中逐行打印数字的项目,我成功地将其重定向到我用于此应用程序的GUI Jframe。然而,当数字被打印到文本区域时,它们并不像滚动列表那样一个接一个地显示出来。相反,我看到整个文本区域一次又一次地闪烁和打印。一旦阅读完成,文本区域中的所有内容看起来都是正确的。有没有一种方法可以正确设置它,使它像我在控制台中看到的那样打印得很好

非常感谢您的帮助

对于system.out的重定向,我有以下代码:

package ibanchecker03;

import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JTextArea;

public class CustomOutputStream extends OutputStream {    
    private JTextArea textArea;

    public CustomOutputStream(JTextArea textArea) {
        this.textArea=textArea;
    }

    @Override
    public void write(int b) throws IOException {
        // redirects data to the text area
        textArea.append(String.valueOf((char)b));
        // scrolls the text area to the end of data
        textArea.setCaretPosition(textArea.getDocument().getLength());
        // keeps the textArea up to date
        textArea.update(textArea.getGraphics());
    }
}
然后,在应用程序类中,我使用以下命令重定向输出:

PrintStream printStream = new PrintStream(new CustomOutputStream(display));
System.setOut(printStream);
System.setErr(printStream);

我建议您实现一个缓冲区(使用
StringBuilder
)并附加到该缓冲区,而不是编写每个字符(并更新每个字符的
textArea
)。仅在
flush()
上更新
textArea
,并在单独的线程中进行更新。大概

public class CustomOutputStream extends OutputStream {
    private StringBuilder sb = new StringBuilder();
    private JTextArea textArea;

    public CustomOutputStream(JTextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void write(int b) throws IOException {
        sb.append((char) b);
    }

    @Override
    public void flush() {
        if (sb.length() > 0) {
            final String toWrite = sb.toString();
            sb.setLength(0);
            SwingUtilities.invokeLater(() -> {
                textArea.append(toWrite);
                textArea.setCaretPosition(textArea.getDocument().getLength());
                textArea.update(textArea.getGraphics());
            });
        }
    }

    @Override
    public void close() {
        flush();
        sb = null;
    }
}

文章的文本和标题是关于
TextField
。代码显示
JTextArea
。请将您的帖子修复并生成代码谢谢您通知我,更正..)嗨,这看起来是一个很好的解决方法。然而,当我应用这个时,我在文本区域中没有看到任何输出。一定还有什么东西不见了。