0

我嵌入到JTextArea: 的记录器遇到问题,当我调用该logger.append()方法时,它工作得很好,但是当我使用 时System.out.println(),我所有的法语口音都丢失了。

System.out在这里,您可以创建记录器并重定向System.err到它。

this.logger = new TextAreaOutputStream(jta, jsp.getVerticalScrollBar());
System.setProperty("user.langage", "fr");
PrintStream ps;
ps = new PrintStream(this.logger, true, "UTF-8");
System.setOut(ps);
System.setErr(ps);

在这里,你有TextAreaOutputStream课。

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

public class TextAreaOutputStream extends OutputStream {
    private JTextArea jta;
    private JScrollBar jsb;

    public TextAreaOutputStream(JTextArea jta, JScrollBar jsb) {
        this.jta = jta;
        this.jsb = jsb;
    }

    public synchronized void append(String s) {
        this.jta.append(s);
        scroll();
    }

    public synchronized void write(int b) throws IOException {
        jta.append(String.valueOf((char) b));
        if (((char) b) == '\n')
            scroll();
    }

    private synchronized void scroll() {
        if ((jsb.getValue() + jsb.getVisibleAmount()) == jsb.getMaximum()) 
            jta.setCaretPosition(jta.getDocument().getLength());
    }
}

我试图将 的编码更改PrintStream为随机编码,它改变了印刷错误的口音的外观,但我永远无法做到正确。我还尝试使用诸如\u00e9for之类的 unicode 条目来更改重音é,但它并没有改变任何东西。

在这里,我非常绝望地寻求你的帮助,

罗曼

4

1 回答 1

1

您的实现OutputStream是错误的:您假装write(int)接收字符,但实际上它接收原始字节。如果您查看PrintStream,您会看到它的printappend方法首先应用编码,然后最终调用write(int)每个编码字节。

您不应尝试将原始字节传输回TextArea. 而是实现PrintStream其基于字符的方法并将这些字符串/字符数组直接推入 UI 组件。

于 2013-06-24T10:15:28.260 回答