小さなプログラムでタブキーイベントをUnixシステムに送信しますか?

小さなプログラムでタブキーイベントをUnixシステムに送信しますか?

リモート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
このクラスはシェルでコマンドを入力して実行できるため、明らかに安全ではありません。つまり、外部コマンドを実行するには完全な権限が必要です。

おすすめ記事