Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Java (http://www.velocityreviews.com/forums/f30-java.html)
-   -   Turning a JTextArea into a InputStream (http://www.velocityreviews.com/forums/t623200-turning-a-jtextarea-into-a-inputstream.html)

cokofreedom@gmail.com 07-01-2008 09:33 AM

Turning a JTextArea into a InputStream
 
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

Daniele Futtorovic 07-01-2008 09:46 AM

Re: Turning a JTextArea into a InputStream
 
On 2008-07-01 11:33 +0100, cokofreedom@gmail.com 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"


All times are GMT. The time now is 11:06 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57