将Sysout值路由到JTextArea

时间:2014-12-31 12:07:46

标签: 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);

为此,我尝试了访问" txtrExecutionStatus"通过为我的主类(Object.java)创建类,但无法访问JTextArea。

有什么建议吗?我记得很长一段时间,我们可以将sysout从Console路由到其他对象,但无法从谷歌回忆/得到答案。

提前谢谢!!并且,提前新年快乐。 :)

1 个答案:

答案 0 :(得分:1)

可以使用System.setOut(PrintStream)重定向System.out。 PrintStream对字节OutputStream进行操作。 因此,必须创建一个OutputStream,它将这些字节转换为String(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);