Turning a JTextArea into a InputStream

C

cokofreedom

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
 
D

Daniele Futtorovic

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top