Java 打印控制台到JFrame TextArea-行为怪异(闪烁屏幕)
我有一个在控制台中逐行打印数字的项目,我成功地将其重定向到我用于此应用程序的GUI Jframe。然而,当数字被打印到文本区域时,它们并不像滚动列表那样一个接一个地显示出来。相反,我看到整个文本区域一次又一次地闪烁和打印。一旦阅读完成,文本区域中的所有内容看起来都是正确的。有没有一种方法可以正确设置它,使它像我在控制台中看到的那样打印得很好 非常感谢您的帮助 对于system.out的重定向,我有以下代码: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
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
。请将您的帖子修复并生成代码谢谢您通知我,更正..)嗨,这看起来是一个很好的解决方法。然而,当我应用这个时,我在文本区域中没有看到任何输出。一定还有什么东西不见了。