
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Desenvolvendo Software &#187; Java</title>
	<atom:link href="http://www.desenvolvendosoftware.com.br/category/software/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.desenvolvendosoftware.com.br</link>
	<description>Tudo o que um desenvolvedor quer e precisa saber</description>
	<lastBuildDate>Tue, 29 Dec 2009 22:11:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Redirecionando a saída padrão para o JTextArea</title>
		<link>http://www.desenvolvendosoftware.com.br/2009/08/redirecionando-a-saida-padrao-para-o-jtextarea/</link>
		<comments>http://www.desenvolvendosoftware.com.br/2009/08/redirecionando-a-saida-padrao-para-o-jtextarea/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 15:51:43 +0000</pubDate>
		<dc:creator>Leila</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.desenvolvendosoftware.com.br/?p=285</guid>
		<description><![CDATA[Em Java, a saída padrão é redirecionada usualmente para o console. Aqui vamos ver como fazer para que seja redirecionada de forma fácil para um componente gráfico, no caso um JTextArea.
Saída Padrão, Saída Padrão de Erro e Entrada Padrão &#8211; Uma Breve História
Tudo começou quando os sistemas operacionais ainda possuiam apenas interface de texto. Os [...]]]></description>
			<content:encoded><![CDATA[<p>Em Java, a saída padrão é redirecionada usualmente para o console. Aqui vamos ver como fazer para que seja redirecionada de forma fácil para um componente gráfico, no caso um JTextArea.</p>
<h2>Saída Padrão, Saída Padrão de Erro e Entrada Padrão &#8211; Uma Breve História</h2>
<p>Tudo começou quando os sistemas operacionais ainda possuiam apenas interface de texto. Os programas não gráficos escrevem na saída padrão (normalmente o vídeo) e leem da entrada padrão (normalmente o teclado). A saída e entrada padrão podem ser redirecionadas pelo sistema operacional, por exemplo, se a saída for redirecionada para a impressora, ela é impressa, sem que se precisse modificar uma única linha de código. Também há a possibilidade de fazer com que a saída padrão de um programa, seja a entrada de outro, um mecanismo chamado <em>pipe</em>. Os fãs de Linux, aqueles que adoram a tela preta do console, escrevem linhas de comando enoooooormes, redirecionando a saída de um programa para a entrada de outro. Isso também pode ser feito no Windows, mas simplesmente não faz parte da cultura.</p>
<p><span id="more-285"></span></p>
<h3>Qual a diferença da saída padrão da saída padrão de erro?</h3>
<p>A saída padrão é a saída &#8220;normal&#8221; do programa e a saída de padrão de erro, bem, é a saída onde os erros são impressos. Isso permite que quando a saída padrão de um programa é redirecionada para outro, as mensagens de erros sejam impressas normalmente na tela.</p>
<h3>Como é no Java?</h3>
<p>Em Java, temos a classe <em>java.lang.System</em>, lá temos <em>System.out</em>, <em>System.err</em> e <em>System.in</em>, que são respectivamente: a saída padrão, a saída padrão de erro e a entrada padrão. A instrução<em> System.out.println(&#8220;Olá mundo!&#8221;); </em>é provavelmente uma das primeiras que qualquer um aprende. Nem todos sabem, no entanto, que também se pode escrever <em>System.err.println(&#8220;Olá mundo tem erro!&#8221;); </em>, e a segunda forma é preferível em caso de mensagens de erro, afinal, é a <strong>saída padrão de erro</strong>. Essas mensagens aparecem na tela preta do console, veremos a seguir como redirecioná-las para um componente gráfico.</p>
<h2>MVC &#8211; Model-View-Controler &#8211;  no JTextArea</h2>
<p>Muitos compenentes gráficos Swing implementam o padrão MVC, isto é, possuem um modelo, um visualizador e um controlador. No caso de um JTextArea, na configuração padrão, o modelo é um documento texto, a visualização é a renderização do texto na tela e o controler é a interpretação dos comandos de edição do usuário. O que temos de mudar é o controlador, não serão eventos gerados pelo usuário e sim o texto escrito na saída padrão. Para isso temos:</p>
<ol>
<li>retirar o controle do usuário, setando a propriedade <em>Editable</em> do <em>JTextArea </em>para <em>false</em>. <strong>Muito Fácil</strong>.</li>
<li>criar uma classe para atualizar o modelo, isto é, um controlador.</li>
<li>redirecionar a saída padrão usando o método <em>System.setOut()</em></li>
</ol>
<h3>Controlador: DocumentOutputStream</h3>
<p>O código do controlador é simples. A classe é derivada de java.io.OutputStream porque para redirecionar a saída padrão ou a saída de erro é necessário um objeto do tipo java.io.PrintStream. Uma forma de criar é usar um objeto do tipo java.io.OutputStream. O construtor do controlador recebe como parâmetro o documento que irá armazenar os dados a serem mostrados pelo visualizador.</p>
<p>A classe <em>java.io.OutputStream</em> requer a implementação de um único método: <em>public void write(int b) throws IOException</em>. No entanto, os dois outros métodos <em>write</em> foram também implementados por razões de eficiência. Caso não fossem, cada caracter incluído no documento geraria um evento, implementando os outros métodos, o número de eventos gerados e consequentemente de objetos cai muito.</p>
<p>Abaixo está o código fonte da classe do controlador e aqui está o <a href="/arquivos-publicos/exemplos/JTextAreaIOExemplo.zip">projeto completo do NetBeans</a>. </p>
<pre class="hl"><span class="hl kwa">package</span> br<span class="hl sym">.</span>com<span class="hl sym">.</span>desenvolvendosoftware<span class="hl sym">;</span>

<span class="hl kwa">import</span> java<span class="hl sym">.</span>io<span class="hl sym">.</span><span class="hl kwc">IOException</span><span class="hl sym">;</span>
<span class="hl kwa">import</span> java<span class="hl sym">.</span>io<span class="hl sym">.</span><span class="hl kwc">OutputStream</span><span class="hl sym">;</span>
<span class="hl kwa">import</span> javax<span class="hl sym">.</span>swing<span class="hl sym">.</span>text<span class="hl sym">.</span><span class="hl kwc">BadLocationException</span><span class="hl sym">;</span>
<span class="hl kwa">import</span> javax<span class="hl sym">.</span>swing<span class="hl sym">.</span>text<span class="hl sym">.</span><span class="hl kwc">Document</span><span class="hl sym">;</span>
<span class="hl kwa">import</span> javax<span class="hl sym">.</span>swing<span class="hl sym">.</span>text<span class="hl sym">.</span><span class="hl kwc">SimpleAttributeSet</span><span class="hl sym">;</span>

<span class="hl com">/**</span>
<span class="hl com"> * Output Stream que escreve para um javax.swing.text.</span>
<span class="hl com"> Document</span>
<span class="hl com"> * Dessa forma pode servir de controler de uma JTextArea</span>
<span class="hl com"> * &#64;author Leila Algarve</span>
<span class="hl com"> */</span>
<span class="hl kwa">public class</span> DocumentOutputStream <span class="hl kwa">extends</span> <span class="hl kwc">OutputStream</span><span class="hl sym">{</span>

    <span class="hl com">/** Documento do JTextArea */</span>
    <span class="hl kwa">private</span> <span class="hl kwc">Document</span> _document<span class="hl sym">;</span>
    <span class="hl com">/** Buffer com os bytes adicionados */</span>
    <span class="hl kwa">private</span> <span class="hl kwc">StringBuffer</span> _buffer<span class="hl sym">;</span>
    <span class="hl com">/** localização do último byte inserido no documento</span>
<span class="hl com">    */</span>
    <span class="hl kwa">private</span> <span class="hl kwb">int</span> _offset<span class="hl sym">;</span>

    <span class="hl kwa">public</span> <span class="hl kwd">DocumentOutputStream</span> <span class="hl sym">(</span><span class="hl kwc">Document</span> document<span class="hl sym">){</span>
        _document <span class="hl sym">=</span> document<span class="hl sym">;</span>
    <span class="hl sym">}</span>

    &#64;Override
    <span class="hl kwa">public</span> <span class="hl kwb">void</span> <span class="hl kwd">write</span><span class="hl sym">(</span><span class="hl kwb">int</span> b<span class="hl sym">)</span> <span class="hl kwa">throws</span> <span class="hl kwc">IOException</span> <span class="hl sym">{</span>

        <span class="hl kwa">try</span> <span class="hl sym">{</span>
            _document<span class="hl sym">.</span><span class="hl kwd">insertString</span><span class="hl sym">(</span>_offset<span class="hl sym">++, (</span><span class="hl kwb">char</span><span class="hl sym">)</span> b <span class="hl sym">+</span> <span class="hl str">&quot;&quot;</span><span class="hl sym">,</span>
                                   <span class="hl kwa">new</span> <span class="hl kwc">SimpleAttributeSet</span><span class="hl sym">());</span>
        <span class="hl sym">}</span> <span class="hl kwa">catch</span> <span class="hl sym">(</span><span class="hl kwc">BadLocationException</span> ex<span class="hl sym">) {</span>
            <span class="hl kwa">new</span> <span class="hl kwc">IOException</span><span class="hl sym">(</span>ex<span class="hl sym">);</span>
        <span class="hl sym">}</span>

    <span class="hl sym">}</span>

    &#64;Override
    <span class="hl kwa">public</span> <span class="hl kwb">void</span> <span class="hl kwd">write</span><span class="hl sym">(</span><span class="hl kwb">byte</span><span class="hl sym">[]</span> bytes<span class="hl sym">,</span> <span class="hl kwb">int</span> off<span class="hl sym">,</span> <span class="hl kwb">int</span> len<span class="hl sym">)</span> <span class="hl kwa">throws</span>
                      <span class="hl kwc">IOException</span> <span class="hl sym">{</span>
        <span class="hl kwc">StringBuffer</span> buffer <span class="hl sym">=</span> <span class="hl kwa">new</span> <span class="hl kwc">StringBuffer</span><span class="hl sym">();</span>
        <span class="hl kwa">for</span> <span class="hl sym">(</span><span class="hl kwb">int</span> indice<span class="hl sym">=</span>off<span class="hl sym">;</span> indice <span class="hl sym">&lt;</span> len<span class="hl sym">;</span> indice <span class="hl sym">++)</span>
            buffer<span class="hl sym">.</span><span class="hl kwd">append</span><span class="hl sym">((</span><span class="hl kwb">char</span><span class="hl sym">)</span>bytes<span class="hl sym">[</span>indice<span class="hl sym">]);</span>
        <span class="hl kwa">try</span> <span class="hl sym">{</span>
            _document<span class="hl sym">.</span><span class="hl kwd">insertString</span><span class="hl sym">(</span>_offset<span class="hl sym">,</span> buffer<span class="hl sym">.</span><span class="hl kwd">toString</span><span class="hl sym">()</span>
                                   <span class="hl sym">,</span> <span class="hl kwa">new</span> <span class="hl kwc">SimpleAttributeSet</span><span class="hl sym">()</span>
                                   <span class="hl sym">);</span>
            _offset <span class="hl sym">+=</span> buffer<span class="hl sym">.</span><span class="hl kwd">length</span><span class="hl sym">();</span>
        <span class="hl sym">}</span> <span class="hl kwa">catch</span> <span class="hl sym">(</span><span class="hl kwc">BadLocationException</span> ex<span class="hl sym">) {</span>
            <span class="hl kwa">new</span> <span class="hl kwc">IOException</span><span class="hl sym">(</span>ex<span class="hl sym">);</span>
        <span class="hl sym">}</span>
    <span class="hl sym">}</span>

    &#64;Override
    <span class="hl kwa">public</span> <span class="hl kwb">void</span> <span class="hl kwd">write</span><span class="hl sym">(</span><span class="hl kwb">byte</span><span class="hl sym">[]</span> bytes<span class="hl sym">)</span> <span class="hl kwa">throws</span> <span class="hl kwc">IOException</span> <span class="hl sym">{</span>
        <span class="hl kwc">StringBuffer</span> buffer <span class="hl sym">=</span> <span class="hl kwa">new</span> <span class="hl kwc">StringBuffer</span><span class="hl sym">();</span>
        <span class="hl kwa">for</span> <span class="hl sym">(</span><span class="hl kwb">byte</span> b <span class="hl sym">:</span> bytes<span class="hl sym">)</span> buffer<span class="hl sym">.</span><span class="hl kwd">append</span><span class="hl sym">((</span><span class="hl kwb">char</span><span class="hl sym">)</span>b<span class="hl sym">);</span>
        <span class="hl kwa">try</span> <span class="hl sym">{</span>
            _document<span class="hl sym">.</span><span class="hl kwd">insertString</span><span class="hl sym">(</span>_offset<span class="hl sym">,</span> buffer<span class="hl sym">.</span><span class="hl kwd">toString</span><span class="hl sym">()</span>
                                   <span class="hl sym">,</span> <span class="hl kwa">new</span> <span class="hl kwc">SimpleAttributeSet</span><span class="hl sym">()</span>
                                   <span class="hl sym">);</span>
            _offset <span class="hl sym">+=</span> buffer<span class="hl sym">.</span><span class="hl kwd">length</span><span class="hl sym">();</span>
        <span class="hl sym">}</span> <span class="hl kwa">catch</span> <span class="hl sym">(</span><span class="hl kwc">BadLocationException</span> ex<span class="hl sym">) {</span>
            <span class="hl kwa">new</span> <span class="hl kwc">IOException</span><span class="hl sym">(</span>ex<span class="hl sym">);</span>
        <span class="hl sym">}</span>
    <span class="hl sym">}</span>

<span class="hl sym">}</span>
</pre>
<p><strong>Post inspirado na pergunta de forum postada por <a href="http://javafree.uol.com.br/topic-874692-como-simular-um-console-com-jTextArea.html">rogerio3d</a>.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.desenvolvendosoftware.com.br/2009/08/redirecionando-a-saida-padrao-para-o-jtextarea/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

