Emulando o console do Java

9 respostas
marcioyudi

Existe alguma maneira de se “emular” o console Java em um aplicativo Swing ? Eu estou tentando criar uma especie de prompt do Ms-dos ou algo parecido com o console Java que existe no Eclipse.

9 Respostas

cv1

Taca um JTextArea (ou TextArea, em AWT ou SWT) e redireciona a System.out e System.in. Da uma olhada no javadoc da java.lang.System :wink:

marcioyudi

Eu li, revi … mas mesmo assim não entendi como devo proceder. Poderia exemplificar ?

T

Vamos por partes (é igual a construir um túnel, você para economizar tempo começa a furar pelos dois lados da montanha, e com sorte você vai fazer as duas metades do túnel se encontrarem):

  • Para a saída
    System.setOut(PrintStream out) é o que “redireciona” o System.out.

Ela recebe um PrintStream, portanto você teria de criar uma classe derivada de PrintStream. Como essa classe tem muitos métodos para sobreescrever, vamos fazer uma coisa mais simples, que é criar uma classe derivada de OutputStream (pois PrintStream tem um construtor que recebe um OutputStream).

OutputStream é mais fácil de implementar, pois apenas um método é estritamente necessário de ser implementado: public void write (int b), que escreve 1 byte.

Assim, você deve criar uma classe derivada de OutputStream, cujo construtor recebe um TextArea ou JTextArea, e cujo método write deve acrescentar 1 byte à string exibida pela JTextArea. (Obviamente, para a string não estourar, é melhor ver o tamanho, e limitar o número de linhas…)

Puxa, furei demais o túnel, nem precisei de furar pelo outro lado. Já chegamos…

cv1

Valeu, thingol :slight_smile:

Nao sei se vc consegue se dar bem so implementando o write(int b) da OutputStream, mas jah eh um bom comeco. Implementar o close() & friends talvez seja interessante tambem :smiley:

marcioyudi

cv:
Valeu, thingol :slight_smile:

Nao sei se vc consegue se dar bem so implementando o write(int b) da OutputStream, mas jah eh um bom comeco. Implementar o close() & friends talvez seja interessante tambem :D

Não entendi a piadinha!

cv1

Nao teve piadinha :?

marcioyudi

Tudo bem, agora eu so estou precisando fazer a conversao de um inteiro para o seu equivalente como caracter. Mais especificamente, tentar fazer a codificação dentro do metodo write(int arg0) que sobreescrevi na minha classe extendida OutputStream.

Pois quando eu mando, por exemplo, a letra “a”; é apresentado o número 61 (Igual a representação segundo a tabela ASCII).

Por outro lado, já tentei usar o método estático Character.forDigit(int arg0, int radix), so que não tive sucesso.

O que eu posso fazer para resolver esse pequeno problema ?

T

Pois então, o que você está recebendo no método write (int b) é um byte de cada vez, na verdade.
Experimente fazer o seguinte - considerar o byte como um caracter, usando (char) (b & 0xFF). Use String.valueOf (char) para obter uma string que representa o tal caracter.

Para que a sua classe seja mais rápida, você pode sobreescrever também aqueles métodos write(byte[]) etc - a conversão de byte[] para String é mais rápida que converter 1 byte de cada vez e ir adicionando um caracter de cada vez na String.

cv1

…e cuidado com os encodings :wink:

Criado 14 de janeiro de 2005
Ultima resposta 21 de jan. de 2005
Respostas 9
Participantes 3