java - 将 Sysout 值路由到 JTextArea

标签 java awt jtextarea

所以,我在文件“Functions.java”中有一个方法,如下所示。

public static void updateDataToExcel (String ExcelFileName) throws IOException {
...
...
System.out.println("File Not Found!");
...
Sysout("File Created!");
...
Sysout("Data Updated");
...
}

现在,我在我的主类中调用它,其中有一个“文本区域”。因此,每当到达“sysout”时,我希望数据在下面的文本区域中更新,而不是在控制台中更新。

JTextArea txtrExecutionStatus = new JTextArea();
txtrExecutionStatus.setFont(new Font("Verdana", Font.PLAIN, 11));
txtrExecutionStatus.setText("Execution Status:\r\n");
txtrExecutionStatus.setBounds(53, 188, 378, 102);
panel.add(txtrExecutionStatus);

为此,我尝试通过为主类 (Object.java) 创建类来访问“txtrExecutionStatus”,但 JTextArea 不可访问。

有什么建议吗?我记得很久以前读过我们可以将系统输出从控制台路由到其他对象,但无法记忆/从谷歌获得答案。

先谢谢你了!!还有,提前祝大家新年快乐。 :)

最佳答案

可以使用System.setOut(PrintStream)重定向System.out。 PrintStream 对字节进行操作,OutputStream。 因此,必须创建一个 OutputStream,将这些字节转换为字符串 (Unicode)。然后就可以使用JTextArea.append了。 我将 PrintStream 的自动刷新设置为 true。并覆盖冲洗以冲洗线路。为了更好的性能。

JTextArea txtrExecutionStatus = new JTextArea();
...
OutputStream textAreaOut = new OutputStream() {
    private ByteArrayOutputStream lineBuffer = new ByteArrayOutputStream();

    @Override
    public void write(int b) {
        lineBuffer.write(b);
    }

    @Override
    public void flush() {
        byte[] bytes = lineBuffer.toByteArray();
        lineBuffer.reset();
        String line = new String(bytes); // Default OS encoding.
        txtrExecutionStatus.append(line);
    }
}

PrintStream redirect = new PrintStream(textAreaOut, true);
System.setOut(redirect);

关于java - 将 Sysout 值路由到 JTextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27720928/

相关文章:

java - 将 URL 转换为普通的 windows 文件名 Java

java - 将位图设置为 ImageView

java - 是否有一个 Hamcrest "for each"Matcher 断言 Collection 或 Iterable 的所有元素都匹配单个特定的 Matcher?

Java Choice 选定索引未正确返回

java - 如何使用actionPerformed()旋转ImageIcon()?

java - 使用 JLabel 将 JTextArea 插入 JPanel

java - java层次结构不明确

java - 将 Canvas 添加到面板后不显示 Canvas ?

java - JTable 单元格可变高度和通过 HTML 标签着色字符串

Java Swing,单击按钮,输出到 JTextArea