リモートUNIXシステムと対話する小さなプログラムがあります。すべてが正常です。私はganymede-sshコードに従います。以下はコード抜粋です。
session = CLIUtil.createTerminal();
if (session != null) {
in = session.getStdout();
out = session.getStdin();
thread = new RemoteThread();
thread.start();
public void keyPressed(KeyEvent key) {
int keyCode = key.getKeyCode();
try {
else if (keyCode == KeyEvent.VK_L && ctrlMask)
{
cmd = CLIConstants.CLEAR_COMMAND;
out.write(new String(cmd + "\n").getBytes());
}
else if ((keyCode >= KeyEvent.VK_A && keyCode <= KeyEvent.VK_Z && !ctrlMask) ||
(keyCode >= KeyEvent.VK_0 && keyCode <= KeyEvent.VK_9 && !ctrlMask) ||
keyCode == KeyEvent.VK_QUOTE || keyCode == KeyEvent.VK_MINUS ||
keyCode == KeyEvent.VK_PERIOD || keyCode == KeyEvent.VK_SLASH ||
keyCode == KeyEvent.VK_BACK_SLASH || keyCode == KeyEvent.VK_SPACE)
{
int cursorPosition = terminalArea.getCaretPosition();
System.out.println("Cursor Position = " + cursorPosition);
terminalArea.append("" + key.getKeyChar());
cmd = cmd + key.getKeyChar();
terminalArea.setCaretPosition(cursorPosition + 1);
}
else if (keyCode == KeyEvent.VK_ENTER)
{
try {
out.write(new String(cmd + "\n").getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
class RemoteThread extends Thread {
int x = 100;
int y = 3000;
char[][] lines = new char[y][];
int posy = 0;
int posx = 0;
@Override
public void run() {
try {
while (true) {
byte[] buff = new byte[8192];
int len = in.read(buff);
if (len != -1) {
addTextToTerminal(buff, len);
if (cmd.startsWith(CLIConstants.CLEAR_COMMAND))
out.write("\n".getBytes());
cmd = "";
} else {
CLIUtil.terminateConnection();
}
public void addTextToTerminal(byte[] buff, int len) {
if (cmd.startsWith(CLIConstants.CLEAR_COMMAND)) {
try {
lines = null;
posx = posy = 0;
while (in.available() <= 10)
;
while (in.available() > 0) {
in.skip(in.available());
}
} catch (IOException e) {
e.printStackTrace();
}
return;
}
if (lines == null)
lines = new char[y][];
for (int i = 0; i < len; i++) {
char c = (char) (buff[i]);
// Backspace key
if (c == '\b') {
if (posx < 0)
continue;
posx--;
continue;
}
// Carriage Return
if (c == '\r') {
posx = 0;
continue;
}
// New Line
if (c == '\n') {
posy++;
if (posy >= y) {
for (int k = 1; k < y; k++)
lines[k - 1] = lines[k];
posy--;
lines[y - 1] = new char[x];
for (int k = 0; k < x; k++)
lines[y - 1][k] = ' ';
}
continue;
}
// Special Characters
if (c < 32) {
continue;
}
if (posx >= x) {
posx = 0;
posy++;
if (posy >= y) {
posy--;
for (int k = 1; k < y; k++)
lines[k - 1] = lines[k];
lines[y - 1] = new char[x];
for (int k = 0; k < x; k++)
lines[y - 1][k] = ' ';
}
}
if (lines[posy] == null) {
lines[posy] = new char[x];
for (int k = 0; k < x; k++)
lines[posy][k] = ' ';
}
lines[posy][posx] = c;
posx++;
}
StringBuffer sb = new StringBuffer(x * y);
for (int i = 0; i < lines.length; i++) {
if (i != 0)
sb.append('\n');
if (lines[i] != null) {
sb.append(lines[i]);
}
}
String text = sb.toString().trim();
terminalArea.setText(text + " ");
terminalArea.setCaretPosition(((x-1) * 100) + y);
terminalArea.repaint();
}
}
ここではタブキーイベントをキャプチャできますが、リモートUnixシステムに記録していますか?
if(keyCode == KeyEvent.VK_TAB){
String temp = new String();
System.out.println("tab key event");
terminalArea.setFocusTraversalKeysEnabled(false);
//split_string(cmd);
out.write(); ?????
}
ベストアンサー1
以下を使用して主要なイベントを送信できます。java.awt.Robot
:
(これはタブ*を送信するものではありません。)
このようなTabイベントを送信すると、以下を最小限に使用することが示されますjava.awt.Robot
。
public class SendTabKey {
public static void main(String[] args) { new SendTabKey(); }
public SendTabKey() { try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
} catch (Exception ex) { ex.printStackTrace(); }
}
}
(robot
線以外のすべてを無視します。)
*)
何をしたいのか分かりません。したがって、これは主にタイトルの明確な質問に対する明確な答えです。
アプレットからイベントを送信するにはアクセス許可が必要ですjava.awt.Robot
。
このクラスはシェルでコマンドを入力して実行できるため、明らかに安全ではありません。つまり、外部コマンドを実行するには完全な権限が必要です。