将控制台输出添加到可以支持特殊字符的 Swing gui
Adding a console output to Swing gui that can support special characters
我的应用程序有一个控制台,系统的所有打印流内容都被重新路由到该控制台。
我的应用程序还将输出特殊字符,特别是其他语言(亚洲语言、俄语、阿拉伯语等)
我正在使用 JTextArea 作为控制台输出:
consoleOutput = new JTextArea(1, 50);
DefaultCaret caret = (DefaultCaret) consoleOutput.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
Font font = new Font("Consolas", Font.PLAIN, 12);
consoleOutput.setFont(font);
JScrollPane scrollPane = new JScrollPane(consoleOutput);
this.add(scrollPane, BorderLayout.CENTER);
//CHANGE OUTPUT TO THIS CONSOLE
PrintStream out = new PrintStream(new TextAreaOutput(consoleOutput));
System.setOut(out);
System.setErr(out);
然后 class 重新路由打印流:
public class TextAreaOutput extends OutputStream {
JTextArea outputConsole;
public TextAreaOutput(JTextArea outputConsole) {
this.outputConsole = outputConsole;
}
@Override
public void write(int b) throws IOException {
outputConsole.append( String.valueOf( ( char )b ) );
}
}
这有效并且打印流打印到这个 jtextarea。但是,我有编码问题。 ▒, █, .نت, 览, etc
等特殊字符无法正确呈现。有些可能被硬编码到源文件中(我使用的是 UTF-8),但有些可能是使用 selenium webdriver 从网络中提取的。
- 这是一种可能的实现方式:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Date;
import javax.swing.*;
public class TextAreaOutputStreamTest {
private final JTextArea consoleOutput = new JTextArea();
private final JTextField textField = new JTextField();
public JComponent makeUI() {
try {
OutputStream os = new TextAreaOutputStream(consoleOutput);
System.setOut(new PrintStream(os, true, "UTF-8"));
} catch (IOException ex) {
ex.printStackTrace();
}
Box box = Box.createHorizontalBox();
box.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
box.add(Box.createHorizontalGlue());
box.add(textField);
box.add(Box.createHorizontalStrut(5));
box.add(new JButton(new AbstractAction("Enter") {
@Override public void actionPerformed(ActionEvent e) {
String s = new Date().toString();
System.out.println(s + "\n " + textField.getText());
}
}));
consoleOutput.setEditable(false);
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(consoleOutput));
p.add(box, BorderLayout.SOUTH);
return p;
}
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new TextAreaOutputStreamTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class TextAreaOutputStream extends OutputStream {
private final ByteArrayOutputStream buf = new ByteArrayOutputStream();
private final JTextArea consoleOutput;
public TextAreaOutputStream(JTextArea consoleOutput) {
super();
this.consoleOutput = consoleOutput;
}
@Override public void flush() throws IOException {
consoleOutput.append(buf.toString("UTF-8"));
buf.reset();
}
@Override public void write(int b) throws IOException {
buf.write(b);
}
}
我的应用程序有一个控制台,系统的所有打印流内容都被重新路由到该控制台。
我的应用程序还将输出特殊字符,特别是其他语言(亚洲语言、俄语、阿拉伯语等)
我正在使用 JTextArea 作为控制台输出:
consoleOutput = new JTextArea(1, 50);
DefaultCaret caret = (DefaultCaret) consoleOutput.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
Font font = new Font("Consolas", Font.PLAIN, 12);
consoleOutput.setFont(font);
JScrollPane scrollPane = new JScrollPane(consoleOutput);
this.add(scrollPane, BorderLayout.CENTER);
//CHANGE OUTPUT TO THIS CONSOLE
PrintStream out = new PrintStream(new TextAreaOutput(consoleOutput));
System.setOut(out);
System.setErr(out);
然后 class 重新路由打印流:
public class TextAreaOutput extends OutputStream {
JTextArea outputConsole;
public TextAreaOutput(JTextArea outputConsole) {
this.outputConsole = outputConsole;
}
@Override
public void write(int b) throws IOException {
outputConsole.append( String.valueOf( ( char )b ) );
}
}
这有效并且打印流打印到这个 jtextarea。但是,我有编码问题。 ▒, █, .نت, 览, etc
等特殊字符无法正确呈现。有些可能被硬编码到源文件中(我使用的是 UTF-8),但有些可能是使用 selenium webdriver 从网络中提取的。
- 这是一种可能的实现方式:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Date;
import javax.swing.*;
public class TextAreaOutputStreamTest {
private final JTextArea consoleOutput = new JTextArea();
private final JTextField textField = new JTextField();
public JComponent makeUI() {
try {
OutputStream os = new TextAreaOutputStream(consoleOutput);
System.setOut(new PrintStream(os, true, "UTF-8"));
} catch (IOException ex) {
ex.printStackTrace();
}
Box box = Box.createHorizontalBox();
box.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
box.add(Box.createHorizontalGlue());
box.add(textField);
box.add(Box.createHorizontalStrut(5));
box.add(new JButton(new AbstractAction("Enter") {
@Override public void actionPerformed(ActionEvent e) {
String s = new Date().toString();
System.out.println(s + "\n " + textField.getText());
}
}));
consoleOutput.setEditable(false);
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(consoleOutput));
p.add(box, BorderLayout.SOUTH);
return p;
}
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new TextAreaOutputStreamTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class TextAreaOutputStream extends OutputStream {
private final ByteArrayOutputStream buf = new ByteArrayOutputStream();
private final JTextArea consoleOutput;
public TextAreaOutputStream(JTextArea consoleOutput) {
super();
this.consoleOutput = consoleOutput;
}
@Override public void flush() throws IOException {
consoleOutput.append(buf.toString("UTF-8"));
buf.reset();
}
@Override public void write(int b) throws IOException {
buf.write(b);
}
}