在 JTextPane 中显示 Midnight Commander 屏幕
Displaying Midnight Commander screen in JTextPane
我尝试通过 SSH 连接到服务器并获取我的命令的输出。如果我输入 System.out
,一切正常。否则如果我想把它放入 JTextPane
,它会放入,但 MC 是不可读的。
这是我的代码:
JSch jsch = new JSch();
String command = "";
String commandR = "";
host = null;
if (arg.length > 1) {
host = arg[0];
command = arg[2];
commandR = arg[3];
}
String user = host.substring(0, host.indexOf('@'));
host = host.substring(host.indexOf('@') + 1);
Session session = jsch.getSession(user, host, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(arg[1]);
if (!session.isConnected()) {
session.connect();
}
Channel channel = session.openChannel("shell");
String ans = " ";
InputStream in = channel.getInputStream();
OutputStream out = channel.getOutputStream();
//channel.setInputStream(System.in);
if (!channel.isConnected()) {
channel.connect(10 * 1000);
}
boolean logon = false;
boolean started = false;
boolean brtuser = false;
boolean log = false;
byte[] tmp = new byte[1024];
JFrame j = new JFrame();
JTextPane jj = new JTextPane();
jj.setContentType("text/html");
StyledDocument doc = (StyledDocument )jj.getDocument();
jj.setPreferredSize(new Dimension(500, 600));
j.setDefaultCloseOperation(2);
j.add(new JScrollPane(jj));
j.pack();
j.setVisible(true);
while (!started) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) {
break;
}
// jj.append();
doc.insertString(doc.getLength(), new String(tmp, 0, i), null);
ans += new String(tmp, 0, i);
System.out.print(new String(tmp, 0, i));
然后我写 pwd
和 mc
- pwd
我没问题,但是 mc
就像
39m[49m
[37m[40m [23;3H[22;1H[39m[49mGNU Midnight Commander 4.6.0
[1;1H[30m[46m Left File Command Options Right
[37m[44m+[0m[37m[44m<[37m[44m-[0m[37m[44m~[37m[44m---------------------------------[0m[37m[44mv>[37m[44m++[0m[30m[47m<[37m[44m-[0m[30m[47m~[37m[44m---------------------------------[0m[30m[47mv>[37m[44m+
|[0m[1m[33m[44m Name [0m[37m[44m|[0m[1m[33m[44m Size [0m[37m[44m|[0m[1m[33m[44m MTime [0m[37m[44m||[0m[1m[33m[44m Name [0m[37m[44m|[0m[1m[33m[44m Size [0m[37m[44m|[0m[1m[33m[44m MTime [0m[37m[44m|
|[0m[1m[37m[44m/.. [0m[37m[44m|[0m[1m[37m[44mUP--DIR[0m[37m[44m|[0m[1m[37m[44m [0m[37m[44m||[0m[30m[46m/.. [30m[46m|[0m[30m[46mUP--DIR[30m[46m|[0m[30m[46m [37m[44m|
|[0m[1m[37m[44m/.mc [0m[37m[44m|[0m[1m[37m[44m 1024[0m[37m[44m|[0m[1m[37m[44mJan 29 11:35[0m[37m[44m||[0m[1m[37m[44m/.mc
请帮助我让它可见!
您在 JTextPane
中看到的 "garbage" 是 ANSI escape codes。这些定义颜色和其他格式。 Midnight Commander(和其他应用程序)使用它们在文本控制台上呈现类似 GUI 的界面。
Terminal/SSH 像 PuTTY 这样的客户端可以理解 ANSI 转义码。甚至通过各种操作系统中的控制台 windows(例如 Windows)。这可能就是为什么将输出打印到 System.out
.
时看起来不错的原因
但是JTextPane
不理解它们,它按原样显示它们。
参见 ANSI colors in Java Swing text fields "ANSI colored JTextPane
subclass"。
我尝试通过 SSH 连接到服务器并获取我的命令的输出。如果我输入 System.out
,一切正常。否则如果我想把它放入 JTextPane
,它会放入,但 MC 是不可读的。
这是我的代码:
JSch jsch = new JSch();
String command = "";
String commandR = "";
host = null;
if (arg.length > 1) {
host = arg[0];
command = arg[2];
commandR = arg[3];
}
String user = host.substring(0, host.indexOf('@'));
host = host.substring(host.indexOf('@') + 1);
Session session = jsch.getSession(user, host, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(arg[1]);
if (!session.isConnected()) {
session.connect();
}
Channel channel = session.openChannel("shell");
String ans = " ";
InputStream in = channel.getInputStream();
OutputStream out = channel.getOutputStream();
//channel.setInputStream(System.in);
if (!channel.isConnected()) {
channel.connect(10 * 1000);
}
boolean logon = false;
boolean started = false;
boolean brtuser = false;
boolean log = false;
byte[] tmp = new byte[1024];
JFrame j = new JFrame();
JTextPane jj = new JTextPane();
jj.setContentType("text/html");
StyledDocument doc = (StyledDocument )jj.getDocument();
jj.setPreferredSize(new Dimension(500, 600));
j.setDefaultCloseOperation(2);
j.add(new JScrollPane(jj));
j.pack();
j.setVisible(true);
while (!started) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) {
break;
}
// jj.append();
doc.insertString(doc.getLength(), new String(tmp, 0, i), null);
ans += new String(tmp, 0, i);
System.out.print(new String(tmp, 0, i));
然后我写 pwd
和 mc
- pwd
我没问题,但是 mc
就像
39m[49m
[37m[40m [23;3H[22;1H[39m[49mGNU Midnight Commander 4.6.0
[1;1H[30m[46m Left File Command Options Right
[37m[44m+[0m[37m[44m<[37m[44m-[0m[37m[44m~[37m[44m---------------------------------[0m[37m[44mv>[37m[44m++[0m[30m[47m<[37m[44m-[0m[30m[47m~[37m[44m---------------------------------[0m[30m[47mv>[37m[44m+
|[0m[1m[33m[44m Name [0m[37m[44m|[0m[1m[33m[44m Size [0m[37m[44m|[0m[1m[33m[44m MTime [0m[37m[44m||[0m[1m[33m[44m Name [0m[37m[44m|[0m[1m[33m[44m Size [0m[37m[44m|[0m[1m[33m[44m MTime [0m[37m[44m|
|[0m[1m[37m[44m/.. [0m[37m[44m|[0m[1m[37m[44mUP--DIR[0m[37m[44m|[0m[1m[37m[44m [0m[37m[44m||[0m[30m[46m/.. [30m[46m|[0m[30m[46mUP--DIR[30m[46m|[0m[30m[46m [37m[44m|
|[0m[1m[37m[44m/.mc [0m[37m[44m|[0m[1m[37m[44m 1024[0m[37m[44m|[0m[1m[37m[44mJan 29 11:35[0m[37m[44m||[0m[1m[37m[44m/.mc
请帮助我让它可见!
您在 JTextPane
中看到的 "garbage" 是 ANSI escape codes。这些定义颜色和其他格式。 Midnight Commander(和其他应用程序)使用它们在文本控制台上呈现类似 GUI 的界面。
Terminal/SSH 像 PuTTY 这样的客户端可以理解 ANSI 转义码。甚至通过各种操作系统中的控制台 windows(例如 Windows)。这可能就是为什么将输出打印到 System.out
.
但是JTextPane
不理解它们,它按原样显示它们。
参见 ANSI colors in Java Swing text fields "ANSI colored JTextPane
subclass"。