On 2008-07-01 11:33 +0100,
allegedly wrote:
> I've been trying to convert a JTextArea into an InputStream with
> almost no success. After trying to google for a few results any that I
> have found have been of little use.
>
> The idea is to use the JSch to SSH using a JTextArea as an Input and
> another as an Output (with the possibility in the future of linking
> them together). I have been able to make the Output work with the
> following coe segments:
>
> PrintStream out = new PrintStream(new
> TextAreaOutputStream(txtOutput));
>
> final class TextAreaOutputStream extends OutputStream {
> private final JTextArea textArea;
> private final StringBuilder sb = new StringBuilder();
> public TextAreaOutputStream(final JTextArea textArea) {
> this.textArea = textArea;
> }
> @Override
> public void write(int b) throws IOException {
> if (b == '\r') { return; }
> if (b == '\n') {
> textArea.append(sb.toString());
> sb.setLength(0);
> }
> sb.append((char)b);
> }
> }
>
> However my attempts with something similar for an InputStream have
> been largely unsuccessful. Based upon a forum entry on the
> java.sun.com forum I tried to implement the following:
>
> final class TextAreaInputStream extends InputStream implements
> KeyListener {
> String lastLine;
> int lastKeyCode;
> JTextArea txtInput;
> Object mKeyLock = new Object();
> Object mLineLock = new Object();
> private TextAreaInputStream(JTextArea txtInput) {
> this.txtInput = txtInput;
> }
> public String readLine() {
> synchronized(mLineLock) {
> try {
> mLineLock.wait();
> } catch (InterruptedException ex) {
> System.err.println(ex.getMessage());
> }
> }
> return lastLine;
> }
> @Override
> public int read() {
> synchronized(mKeyLock) {
> try {
> mKeyLock.wait();
> } catch (InterruptedException ex) {
> System.err.println(ex.getMessage());
> }
> }
> return lastKeyCode;
> }
> public void keyReleased(KeyEvent e) { }
> public void keyTyped(KeyEvent e) { }
> public void keyPressed(KeyEvent e) {
> System.err.println("keyPressed");
> lastKeyCode = e.getKeyCode();
> if (lastKeyCode == KeyEvent.VK_ENTER) {
> String txt = txtInput.getText();
> int idx = txt.lastIndexOf(
> \n', txtInput.getCaretPosition() - 1);
> lastLine = txt.substring(
> idx != -1 ? idx : 0,
> txtInput.getCaretPosition());
> }
> }
> public InputStream toInputStream() {
> return new MyInputStream();
> }
> private class MyInputStream extends InputStream {
> public int read() {
> return TextAreaInputStream.this.read();
> }
> }
> }
>
> However I do not think this does anything...So I really just want to
> be able to send commands from a JTextArea through the SSH and get the
> reply, and presently I can only get the Reply if I use System.in...
>
> If someone can guide me to a step I have missed, or perhaps get me
> back on track that would be of great help to me!
>
> Thanks
>
> Coko
- Add a few listeners to the TextArea's underlying Document model to
track text input. Write text additions to a simple ByteArrayOutputStream.
- Use Piped(Output|Input)Streams (wrap the BAOUS into a POS, connect
that pipe to a PIS, voilą).
Note: your approach is a bit flawed inasmuch as you won't be able to
deal with text deletions and additions elsewhere than at the end.
--
DF.
to reply privately, change the top-level domain
in the FROM address from "invalid" to "net"