| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. |
| --> |
| <html> |
| <head><link rel="stylesheet" href="../../../print.css" type="text/css" media="print"> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <title>Criando um Cliente Gráfico para o Twitter - Tutorial do NetBeans IDE</title> |
| <meta name="KEYWORDS" content="NETBEANS, TUTORIAL, GUIDE, USER, DOCUMENTATION, |
| WEB SERVICE, WEB SERVICES, REST, SAAS, TWITTER, SWING, GUI, CLIENT, LISTCELLRENDERER"> |
| <meta name="description" |
| content="Using NetBeans IDE, create a simple, graphical, |
| REST-based client that displays Twitter public messages and lets you |
| view and update your Twitter status. The application uses Swing and |
| NetBeans IDE's support for Twitter's SaaS operations."> |
| <link rel="stylesheet" href="../../../netbeans.css"> |
| </head> |
| <body> |
| <h1>Criando um Cliente Gráfico para o Twitter</h1> |
| <p>Neste tutorial, você usa o NetBeans IDE para criar um cliente gráfico simples com base no REST, que exibe mensagens da linha do tempo dos amigos do Twitter e permite exibir e atualizar seu status do Twitter. A aplicação usa o suporte do Swing e do NetBeans IDE para as operações SaaS do Twitter.</p> |
| <img alt="Cliente em execução que exibe mensagens do Twitter" class="margin-around" height="374" src="../../../images_www/articles/72/websvc/twitter-swing/client-display.png" width="570" /> |
| <p>Se não tiver uma conta do Twitter, vá ao <a href="http://twitter.com" target="_blank">twitter.com</a> e crie uma conta antes de prosseguir com este tutorial. </p> |
| <p>Uma amostra completa desta aplicação está disponível para download. Clique <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FWeb%2520Services%252FTwitterSwingClient.zip" target="_blank">aqui</a> para fazer o download da amostra.</p> |
| <p><b>Conteúdo</b></p> |
| <img alt="O conteúdo dessa página aplica-se ao NetBeans IDE 6.9 a 7.1" class="stamp" height="114" src="../../../images_www/articles/69/netbeans-stamp-69-70-71.png" title="O conteúdo desta página aplica-se ao NetBeans IDE 6.9 a 7.1" width="114"> |
| <ul class="toc"> |
| <li><a href="#jframe">Projetando o JFrame</a></li> |
| <li><a href="#show-status">Mostrando Seu Status de Usuário</a></li> |
| <li><a href="#authentication">Obtendo as Chaves OAuth do Twitter</a></li> |
| <li><a href="#run">Executando o Projeto</a></li> |
| <li><a href="#multiservis">Chamando Vários Serviços</a><ul> |
| <li><a href="#add-services">Adicionando serviços e combinando chamadas em uma classe</a></li> |
| |
| <li><a href="#modify-paths">Modificando os caminhos do recurso</a></li> |
| </ul></li> |
| <li><a href="#update-status">Adicionando uma Ação de Atualização de Status</a></li> |
| <li><a href="#public-timeline-autoupdate">Exibindo Nomes de usuário e Status no JFrame</a> |
| <ul> |
| <li><a href="#timer-task">Criando um TimerTask</a></li> |
| <li><a href="#add-run">Adicionando um Método de execução Com a Operação getFriendsTimeline</a></li> |
| <li><a href="#listcellrenderer">Criando um Componente de Renderização da Célula da Lista</a></li> |
| <li><a href="#display-component">Exibindo o Componente no TwitterJFrame</a></li> |
| </ul></li> |
| <li><a href="#connecting-proxy">Conectando por meio do Proxy</a></li> |
| </ul> |
| <p><b>Para concluir este tutorial, você precisa dos seguintes recursos e softwares.</b></p> |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">Software ou Recurso</th> |
| <th class="tblheader" scope="col">Versão Necessária</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html" target="_blank">NetBeans IDE</a></td> |
| <td class="tbltd1">Pacote de download do Java EE</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">Java Development Kit (JDK)</a></td> |
| <td class="tbltd1">Versão 6 ou versão 7<br></td> |
| </tr> |
| <tr> |
| <td class="tbltd1" colspan="2">Nome de usuário e senha para uma conta do <a href="http://www.twitter.com" target="_blank">Twitter</a></td> |
| </tr> |
| </tbody> |
| </table> |
| <h2><a name="jframe"></a>Criando o JFrame</h2> |
| <p>Nesta etapa, você cria os elementos da GUI que exibirão a linha de tempo dos amigos do Twitter, seu ícone de usuário e onde lê e atualiza seu status. Os elementos da GUI serão todos encapsulados em um <a href="http://java.sun.com/javase/6/docs/api/" target="_blank">JFrame</a>. Não é necessário criar o layout dos elementos da GUI exatamente como descrito nesta seção. Este layout é apenas uma sugestão. Você pode, por exemplo, adicionar mais funcionalidades. No entanto, é necessário criar, pelo menos, todos os elementos descritos neste tutorial.</p> |
| <p><strong>Para criar o JFrame:</strong></p> |
| <ol> |
| <li>Escolha Arquivo > Novo Projeto. O Assistente Novo Projeto será Aberto. Selecione a categoria Java e, em seguida, um projeto de Aplicação Java. Clique em Próximo.</li> |
| <li>Nomeie o projeto como TwitterSwingClient. Selecione uma Localização para o Projeto. <em>Desmarque</em> Criar Classe Principal. (O JFrame será a classe principal). Clique em Finalizar.<br /> <img alt="Assistente Novo Projeto que mostra campos para criação do projeto TwitterSwingClient" border="1" class="margin-around" height="443" src="../../../images_www/articles/72/websvc/twitter-swing/create-project.png" width="600"> </li> |
| <li>O IDE cria o projeto TwitterSwingClient, que aparece na janela Projetos. Clique com o botão direito do mouse no nó do projeto TwitterSwingClient e selecione Novo > Form JFrame (ou Novo > Outro > Forms da GUI Swing > Form JFrame). O assistente Novo form JFrame será aberto.</li> |
| <li>Nomeie o form TwitterJFrame e crie um pacote para ele denominado <tt>twitterclient</tt>. Clique em Finalizar. <br><img alt="Assistente Novo Form JFrame que mostra campos para criação do TwitterJFrame" class="margin-around" height="447" src="../../../images_www/articles/72/websvc/twitter-swing/create-jframe-form.png" width="600"></li> |
| <li>O IDE abre o TwitterJFrame no editor na view de Design. Aqui você tem uma paleta de todos os componentes Swing que podem ser arrastados e soltos no JFrame. <br><img alt="J Frame do Twitter na view de Design do Editor" class="margin-around" height="368" src="../../../images_www/articles/72/websvc/twitter-swing/design-view.png" width="600"></li> |
| <li>Clique no ícone Botão em Controles Swing na Paleta. Arraste e solte-o no canto direito inferior do JFrame. Observe que o botão exibe jButton1, que é o nome deste objeto JButton. <br><img alt="JFrame que mostra o jButton1 recém-adicionado" class="margin-around b-all" height="409" src="../../../images_www/articles/72/websvc/twitter-swing/jbutton1.png" width="436"></li> |
| <li>Clique com o botão direito do mouse em jButton1 e selecione Editar Texto no menu de contexto. Altere o texto de exibição para "Atualizar".</li> |
| <li>Arraste e solte um Label (jLabel1) para o canto esquerdo inferior do JFrame. Altere o texto de exibição para "Ícone". Seu ícone de usuário será exibido neste label. </li> |
| <li>Arraste e solte um Campo de Texto (jTextField1) entre o Label e o Botão. Altere o texto de exibição para "Status". Clique na borda direita do campo de texto e estique-a em direção ao botão. Linhas guia azuis aparecerão, mostrando as distâncias sugeridas do botão.</li> |
| <li>Clique com o botão direito do mouse em jLabel1 e selecione Propriedades no menu de contexto. A caixa de diálogo JLabel1 será aberta. Defina a propriedade labelFor para apontar para jTextField1. (Isso aumenta a acessibilidade). </li> |
| <li>Encontre as propriedades Tamanho Máximo, Tamanho Mínimo e Tamanho Preferencial. Defina cada uma dessas propriedades como [48,48], para que correspondam às dimensões 48px X 48px dos ícones do Twitter. <br> <img alt="Propriedades de j Label 1 no J Frame do Twitter, que mostra os tamanhos Máximo, Mínimo e Preferencial definidos como 48, 48" class="margin-around b-all" height="421" src="../../../images_www/articles/72/websvc/twitter-swing/jlabel-properties.png" width="497"></li> |
| <li>Arraste e solte um Painel de Rolagem para a parte superior do JFrame. Arraste suas bordas para expandi-lo para preencher quase ou todo o espaço acima do campo de texto e do botão. (Você pode deixar uma margem se desejar adicionar mais funcionalidade em outro momento, como o menu na <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FWeb%2520Services%252FTwitterSwingClient.zip" target="_blank">amostra</a>).</li> |
| <li>Arraste e solte a Lista no Painel de Rolagem. Aparecerá uma lista de amostra de itens. Salve o TwitterJFrame. O JFrame deveria se parecer com a seguinte imagem: <br> <img alt="J Frame do Twitter na view de Design com todos os elementos básicos da GUI" class="margin-around b-all" height="371" src="../../../images_www/articles/72/websvc/twitter-swing/jframe-with-list.png" width="561"> </li> |
| </ol> |
| <p>Agora temos todos os componentes básicos da GUI para o cliente Swing. É o momento de adicionar a primeira operação Twitter SaaS (Software como um Serviço).</p> |
| <h2><a name="show-status"></a>Mostrando Seu Status de Usuário</h2> |
| <p>Nesta seção você cria um novo método e adiciona a operação Twitter getUserTimeline nesse método. A operação getUserTimeline obtém seu ícone de usuário e seu status atual. Você então adiciona o código ao método para exibir seu ícone e status no jLabel1 e jTextField, respectivamente. Finalmente, adiciona uma linha ao construtor do JFrame para inicializar o método.</p> |
| <p><strong>Para mostrar seu status de usuário:</strong></p> |
| <ol> |
| <li>Alterne para a view Código-Fonte do TwitterJFrame.</li> |
| <li>Pressione Alt-Insert ou clique com o botão direito do mouse e selecione Inserir Código no menu de contexto. Um menu com os códigos para inserção será exibido.<br /><img alt="Menu de códigos para inserção no método initUserInfo" class="margin-around" height="158" src="../../../images_www/articles/72/websvc/twitter-swing/insert-code-menu.png" width="171"></li> |
| <li>Clique em Gerar Cliente REST. A caixa de diálogo Recursos REST Disponíveis será aberta.<br /> <img alt="Caixa de diálogo Recursos REST disponíveis" class="margin-around" height="263" src="../../../images_www/articles/72/websvc/twitter-swing/available-rest-dialog.png" width="386"></li> |
| <li>Selecione o botão de opção IDE Registrado e clique em Procurar. Vá a Twitter > Twitter OAuth > [statuses] > [user_timeline.{format}]. Clique em OK.<br><img alt="Janela Serviços com a árvore Web Services mostrando a operação getUserTimelineById do Twitter escolhida" class="margin-around" height="583" src="../../../images_www/articles/72/websvc/twitter-swing/browse-user-timeline.png" width="430"></li> |
| <li>A caixa de diálogo Recursos REST Disponíveis agora mostra o recurso user_timeline selecionado do OAuth do Twitter, o nome da classe correspondente e o tipo de autenticação do OAuth. Clique em OK.<br><img alt="Caixa de diálogo Recurso REST Disponível preenchida" class="margin-around" height="263" src="../../../images_www/articles/72/websvc/twitter-swing/completed-rest-dialog.png" width="386"></li> |
| <li>Uma caixa de diálogo será aberta perguntando se você deseja gerar objetos Java das referências de esquema XML no arquivo WADL. Clique em Sim.</li> |
| <li>No final da classe TwitterJFrame, o IDE gera uma classe interna chamada Twitter_OAuth_user_timeline__format_JerseyClient. |
| <p>A classe interna é complexa e contém os seguintes campos, métodos e classes internas:</p> |
| <ul> |
| <li><tt>CONSUMER_KEY</tt>: string de Consumer Key</li> |
| <li><tt>CONSUMER_SECRET</tt>: String de Consumer Secret</li> |
| <li><tt>initOAuth()</tt>: método para inicialização do OAuth</li> |
| <li><tt>getUserTimeline()</tt>: método que corresponde ao método HTTP: getUserTimeline (do recurso REST)</li> |
| <li><tt>makeOAuthRequestUnique()</tt>: útil para várias chamadas de API em uma única sessão</li> |
| <li><tt>login</tt>: usado para efetuar log-in na Aplicação Twitter (força a autenticação). Este método chama mais dois métodos gerados, <tt>getOAuthAccessToken</tt> e <tt>getOAuthRequestToken</tt>.</li> |
| </ul> |
| <p>Esta é a estrutura da classe conforme mostrada na janela Navegador.</p> |
| <img alt="Janela Navegador que mostra a classe Twitter_OAuth_user_timeline__format_JerseyClient" class="margin-around" height="459" src="../../../images_www/articles/72/websvc/twitter-swing/user-timeline-internal-class.png" width="572"></li> |
| <li>No TwitterJFrame imediatamente acima da classe interna Twitter_OAuth_user_timeline__format_JerseyClient, digite a seguinte linha de código. Este código cria uma variável chamada <tt>client</tt> para representar uma instância da classe interna. |
| <pre class="examplecode">private Twitter_OAuth_user_timeline__format_JerseyClient client;</pre> |
| <img alt="Snippet de código que mostra a variável do cliente imediatamente acima da classe interna" class="margin-around b-all" height="141" src="../../../images_www/articles/72/websvc/twitter-swing/class-variable.png" width="591"></li> |
| <li>Localize o método <tt>main</tt> no TwitterJFrame. Acima deste método, crie um novo método chamado <tt>initUserInfo</tt> que lança uma MalformedURLException e uma IOException. |
| <pre class="examplecode">private void initUserInfo() throws MalformedURLException, IOException { |
| |
| |
| |
| }</pre> |
| </li> |
| <li>Digite o código a seguir no corpo do método de <tt>initUserInfo</tt>. Os comentários no código explicam o que o código faz. |
| <pre class="examplecode">private void initUserInfo() throws MalformedURLException, IOException { |
| <br> |
| //Create an instance of the internal service class |
| client = new Twitter_OAuth_user_timeline__format_JerseyClient("xml"); |
| <br> |
| //Log in, get tokens, and append the tokens to the consumer and secret |
| //keys |
| client.login(); |
| client.initOAuth(); |
| <br> |
| //Call getUserTimeline, get a list of statuses, pass the most recent |
| //status as a StatusType object, and display the text of that object |
| //in the JTextField |
| Statuses statuses = client.getUserTimeline(Statuses.class, null, null, null, "1"); |
| StatusType st = statuses.getStatus().get(0); |
| jTextField1.setText(st.getText().trim()); |
| <br> |
| //Get a UserType object from the StatusType object, get the URL of that |
| //user's icon, and display that icon in the JLabel |
| UserType user = st.getUser(); |
| String iconSrc = user.getProfileImageUrl(); |
| URL iconUrl = new URL(iconSrc); |
| ImageIcon icon = new ImageIcon(iconUrl, user.getScreenName()); |
| jLabel1.setIcon(icon); |
| }</pre> |
| </li> |
| <li>Abra a caixa de diálogo Corrigir Importações (Ctrl/⌘-Shift-I ou no menu de contexto). Na caixa de diálogo, selecione twitter.twitteroauth.twitterresponse.StatusType e não a classe Java default StatusType.<br> <img alt="Caixa de diálogo Corrigir Importações depois da conclusão do método intUserInfo" class="margin-around" height="347" src="../../../images_www/articles/72/websvc/twitter-swing/inituserinfo-imports.png" width="580"></li> |
| <li>Adicione um bloco try/catch ao construtor TwitterJForm para chamar <tt>initUserInfo</tt> quando a aplicação for executada. Corrija as Importações após adicionar o bloco try/catch. |
| <pre class="examplecode">public TwitterJFrame() { |
| initComponents(); |
| |
| try { |
| initUserInfo(); |
| } catch (IOException ex) { |
| Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); |
| } |
| }</pre> |
| </li> |
| </ol> |
| <p>Depois de <a href="#authentication">obter as chaves OAuth do Twitter</a>, o projeto poderá ser executado. Clique com o botão direito do mouse no nó do projeto e selecione Executar a partir do menu de contexto. Uma aplicação será aberta mostrando seu ícone e status de usuário.</p> |
| |
| <h2><a name="authentication"></a>Obtendo as Chaves OAuth do Twitter</h2> |
| <p>Para que a aplicação Java possa acessar os dados do Twitter, é necessário obter as chaves CUSTOMER_KEY e CUSTOMER_SECRET juntamente com uma string de verificação proveniente do Twitter. O Twitter usa a autorização OAuth, que precisa dessas chaves. No entanto, o OAuth é configurado com a intenção de que seja chamado por uma aplicação Web em um servidor. Para obter as chaves de autorização, registre uma aplicação web "fictícia".</p> |
| <p><b>Para obter as chaves OAuth do Twitter:</b></p> |
| <ol> |
| <li>Abra o browser. Vá para a página <a href="http://twitter.com/apps" target="_blank">Twitter > Aplicações</a> e clique em <a href="http://twitter.com/apps/new" target="_blank">Registrar uma nova aplicação</a>. É necessário efetuar log-in na conta do Twitter. Certifique-se de ter efetuado log-in na conta correta, caso você tenha várias contas.</li> |
| <li>Digite <tt>Aplicação Linha do tempo do Usuário do NB</tt> no campo de texto <strong>Nome da Aplicação</strong>.</li> |
| <li>Digite uma descrição no campo <strong>Descrição</strong>. É necessário digitar uma descrição. Você pode colocar, por exemplo, "Aplicação Java criada no NetBeans IDE chamando a operação user_timeline".</li> |
| <li>Digite um URL arbitrário no campo <strong>Website da Aplicação</strong>.</li> |
| <li>Na opção <strong>Tipo de Aplicação</strong>, selecione o botão de opção Cliente.</li> |
| <li>Na seção <strong>Tipo de Acesso Default</strong>, selecione o botão Leitura e Gravação. |
| <p class="alert"><strong>Cuidado: </strong>certifique-se de ter selecionado Leitura e Gravação. Embora você possa voltar e editar as definições mais tarde, parece que isso não afeta os privilégios de acesso da aplicação.</p></li> |
| <li>Deixe as outras opções como default e clique em Salvar. A página do browser será aberta com os detalhes da aplicação que você registrou. Os detalhes importantes são <strong>consumer key</strong> e <strong>consumer secret</strong>.</li> |
| <li>Copie a Consumer key do browser. No IDE, localize a linha onde a <tt>CONSUMER_KEY</tt> está definida. Cole o valor da consumer key entre as aspas. <br> <img alt="TwitterClient que mostra a localização de CONSUMER_KEY e CONSUMER_SECRET" border="1" class="margin-around" height="269" src="../../../images_www/articles/72/websvc/twitter-swing/keys-in-twitter-client.png" width="552"></li> |
| <li>Copie a chave Consumer secret do browser e cole-a no TwitterSwingClient. Salve as alterações.</li> |
| </ol> |
| <h2><a name="run"></a>Executando o Projeto</h2> |
| <p>Agora que já tem a Consumer key e a chave Consumer secret, pode executar o projeto. A aplicação chama o Twitter, que abre a janela do browser para que você permita que a aplicação acesse os dados. </p> |
| <p><strong>Para executar o projeto:</strong></p> |
| <ol> |
| <li>Se o TwitterSwingClient for o seu projeto principal, pressione F6. Caso contrário, clique com o botão direito do mouse no nó do projeto TwitterSwingClient e selecione Executar no menu de contexto.</li> |
| <li>Uma janela do browser será aberta perguntando se você deseja permitir que a aplicação registrada acesse seus dados do Twitter. Clique em Permitir.</li> |
| <li>A janela do browser será atualizada para uma nova janela que mostra um PIN. Copie esse PIN.</li> |
| <li>No IDE, a janela de saída mostra a solicitação na qual você digita a string oauth_verifier. Cole o PIN depois dos dois-pontos (:) e pressione Enter.<br><img alt="Janela Saída no IDE pedindo a srting de verificação, que ainda não foi colada" class="margin-around" height="128" src="../../../images_www/articles/72/websvc/twitter-swing/request-verifier-string.png" width="496"></li> |
| <li>O cliente da área de trabalho será aberto, exibindo sua última mensagem de status no Twitter.<br> <img alt="Executando a aplicação, mostrando ícone e status do usuário" class="margin-around b-all" height="338" src="../../../images_www/articles/72/websvc/twitter-swing/client-showing-status.png" width="556"></li> |
| </ol> |
| <h2><a name="multiservis"></a>Chamando Vários <tt></tt>Serviços</h2> |
| <p>O desenho final da aplicação requer chamadas a três serviços do Twitter: user_timeline{format} (já chamado), update{format} e friends_timeline{format}. As chamadas para esses serviços precisam compartilhar um log-in. Para que as chamadas compartilhem o mesmo log-in, elas devem estar na mesma classe do cliente. A chamada a vários serviços com base em um cliente requer duas etapas:</p> |
| <ul> |
| <li>Adicionar vários serviços a uma classe do cliente.</li> |
| <li>Modificar os caminhos do recurso na classe do cliente</li> |
| </ul> |
| <div class="indent"> |
| <h3><a name="add-services"></a>Adicionando serviços e combinando chamadas em uma única classe</h3> |
| <p>Nesta seção, você primeiro adiciona clientes de outros serviços e os combina em um cliente geral. </p> |
| <p><strong>Para adicionar vários serviços:</strong></p> |
| <ol> |
| <li>Pressione Alt-Insert e selecione Gerar Cliente REST.<br> <img alt="Menu de códigos para inserção no método initUserInfo" class="margin-around" height="158" src="../../../images_www/articles/72/websvc/twitter-swing/insert-code-menu.png" width="171"></li> |
| <li>Siga o mesmo procedimento para gerar um cliente REST que você seguiu na seção <a href="#show-status">Mostrando Seu Status de Usuário</a>, mas selecione o serviço [statuses] > [update.{format}]. O IDE gerará a classe interna Twitter_OAuth_update__format_JerseyClient, que é semelhante à classe Twitter_OAuth_user_timeline__format_JerseyClient.<br> <img alt="A caixa de diálogo Recursos REST Disponíveis mostrando o serviço de atualização de formato" class="margin-around" height="567" src="../../../images_www/articles/72/websvc/twitter-swing/select-update-format.png" width="430"></li> |
| <li>Repita as etapas 1 e 2 acima, mas adicione um cliente ao serviço [friends_timeline.{format}].</li> |
| <li>Altere o nome da classe original Twitter_OAuth_user_timeline__format_JerseyClient. Você transformará essa classe na classe geral do cliente que chamará os três serviços. Selecione uma instância do nome Twitter_OAuth_user_timeline__format_JerseyClient e pressione Ctrl-R ou clique com o botão direito do mouse e selecione Refatorar > Renomear. A caixa de diálogo Renomear Classe será aberta. Digite o novo nome TwitterClient.<br><img alt="Caixa de diálogo Renomear Classe com novo TwitterClient" class="margin-around" height="225" src="../../../images_www/articles/72/websvc/twitter-swing/rename-dialog.png" width="396"></li> |
| <li>Clique em Refatorar. O IDE substituirá todas as instâncias do nome da classe.<br><img alt="Nome da classe alterado em vários lugares" border="1" class="margin-around" height="163" src="../../../images_www/articles/72/websvc/twitter-swing/replaced-names.png" width="331"></li> |
| <li>Na janela Navegador, localize a classe Twitter_Oauth_friends_timeline__format_JerseyClient. Nessa classe, localize e clique duas vezes no método <tt>getFriendsTimeline</tt>.<br> <img alt="Janela Navegador que mostra o método getPublicTimeline" class="margin-around" height="286" src="../../../images_www/articles/72/websvc/twitter-swing/navigate-getpublictimeline.png" width="369"></li> |
| <li>O cursor do Editor se move para o método <tt>getFriendsTimeline</tt>. Recorte esse método (reproduzido abaixo). |
| <pre class="examplecode">public <T> T getFriendsTimeline(Class<T> responseType, String since, String since_id, String page, String count) throws UniformInterfaceException { |
| String[] queryParamNames = new String[]{"since", "since_id", "page", "count"}; |
| String[] queryParamValues = new String[]{since, since_id, page, count}; |
| return webResource.queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType); |
| }</pre> |
| </li> |
| <li>Cole o método <tt>getFriendsTimeline</tt> na classe interna TwitterClient, abaixo do método <tt>getUserTimeline</tt>.</li> |
| <li>Recorte e cole o método <tt>updateStatus</tt> do Twitter_OAuth_update__format_JerseyClient em TwitterClient, abaixo do método <tt>getFriendsTimeline</tt>.</li> |
| </ol> |
| |
| |
| |
| |
| <h3><a name="modify-paths"></a>Modificando os caminhos do recurso</h3> |
| <p>Todas as chamadas de serviço do Twitter estão agora em uma classe do cliente. No entanto, os caminhos do recurso dessa classe do cliente não estão construídos corretamente. O IDE gerou os caminhos do recurso específicos para o serviço user_timeline ao gerar a classe pela primeira vez. É necessário modificar a classe para que, no nível da classe, o caminho do recurso seja genérico e os caminhos específicos sejam designados pelos métodos de chamada de serviço.</p> |
| <p><strong>Para modificar os caminhos do recurso:</strong></p> |
| <ol> |
| <li>Localize o construtor TwitterClient e remova o parâmetro <tt>String format</tt>.<br> <img alt="View de antes e depois da remoção do parâmetro do construtor" class="margin-around" height="160" src="../../../images_www/articles/72/websvc/twitter-swing/remove-format-pm.png" width="600"></li> |
| <li>Será exibida uma barra vermelha de erros na margem direita. Ao clicar nela, você será levado à linha do <tt>initUserInfo</tt> que instancia a classe TwitterClient. Essa linha é <tt>client = new TwitterClient("xml");</tt>. Delete o parâmetro "xml", pois o construtor TwitterClient já não o utiliza. A linha agora é <tt>client = new TwitterClient();</tt>. Os ícones de erro desaparecerão.</li> |
| <li>Volte ao construtor TwitterClient. (A janela Navegador pode ajudá-lo.) Localize a seguinte linha: |
| <pre class="examplecode">String resourcePath = java.text.MessageFormat.format("statuses/user_timeline.{0}", new Object[]{format}); </pre> |
| <p>Essa linha define o <tt>resourcePath</tt> de toda a classe. Altere a linha para que <tt>resourcePath</tt> aponte para o diretório <tt>statuses</tt> pai. A linha agora fica assim:</p> |
| |
| <pre class="examplecode">String resourcePath = "statuses";</pre></li> |
| |
| <li>Vá ao método <tt>getUserTimeline</tt>. Localize a linha <tt>return</tt>:<br> |
| <pre class="examplecode">return webResource.queryParams(getQueryOrFormParams(queryParamNames, queryParamValues))...;</pre> |
| <p>Acrescente informações sobre o caminho (em <strong>negrito</strong>, abaixo) ao início da chamada.</p><pre class="examplecode">return webResource.<strong>path("user_timeline.xml").</strong>queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);</pre> |
| </li> |
| <li>Vá ao método <tt>getFriendsTimeline</tt>. Localize a linha <tt>return</tt>:<br> |
| <pre class="examplecode">return webResource.queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);</pre> |
| <p>Acrescente informações sobre o caminho ao início da chamada.</p> |
| <pre class="examplecode">return webResource.path("friends_timeline.xml").queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);<br> |
| </pre> |
| </li> |
| <li>Navegue ao método <tt>updateStatus</tt>. Localize a linha <tt>return</tt>:<br> |
| <pre class="examplecode">return webResource.type(javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED)...</pre> |
| <p>Acrescente informações sobre o caminho ao início da chamada.</p> |
| |
| <pre class="examplecode">return webResource.<strong>path("update.xml").</strong>type(javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED).post(responseType, getQueryOrFormParams(formParamNames, formParamValues));</pre> |
| </li> |
| <li>Localize e comente o método <tt>setResourcePath</tt> do TwitterClient. Ele nunca é chamado, mas isso é uma precaução.</li> |
| <li>Delete as classes Twitter_OAuth_update__format_JerseyClient e Twitter_Oauth_friends_timeline__format_JerseyClient. </li> |
| </ol> |
| |
| <p>Agora há três serviços disponíveis na classe JerseyClient.</p> |
| <p class="alert"><b>Importante:</b> são alteradas três instruções <tt>return</tt> em três métodos no procedimento acima. Certifique-se de ter alterado as três!</p> |
| </div> |
| <h2><a name="update-status"></a>Adicionando uma Ação de Atualização de Status</h2> |
| <ol> |
| <li>Retorne à view de Design do TwitterJFrame. Clique duas vezes no botão Atualizar no JFrame. O editor volta para a view Código-fonte, no corpo do método <tt>jButton1ActionPerformed</tt>, que o IDE acabou de criar para você. <br> <img alt="TwitterJFrame na view Código-fonte, com o cursor no meio do método jButton1ActionPerformed recém-criado" border="1" class="margin-around" height="341" src="../../../images_www/articles/72/websvc/twitter-swing/jbutton1-code.png" width="600"></li> |
| <li>Preencha o corpo do método <tt>jButton1ActionPerformed</tt> da seguinte forma: |
| <p class="alert"><b>Cuidado:</b> ao atualizar seu status, ele aparecerá com a codificação UTF-8, com espaços como sinais de + ou símbolos %21, etc. No entanto, se não converter o conteúdo do campo de texto para UTF-8, a aplicação falhará exibindo "Assinatura inválida" se você digitar espaços na mensagem de status! Se alguém encontrar uma solução para esse problema, entre em contato conosco usando o link Feedback na parte inferior do tutorial. </p> |
| <pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { |
| String rawStatus = jTextField1.getText().trim(); |
| String status = URLEncoder.encode(rawStatus, "UTF-8"); |
| client.makeOAuthRequestUnique(); |
| try { |
| client.updateStatus(String.class, status, null); |
| } catch(UniformInterfaceException ex) { |
| System.out.println("Exception when calling updateStatus = " + ex.getResponse().getEntity(String.class)); |
| } |
| |
| } </pre> |
| </li> |
| </ol> |
| <p>Esse código obtém o texto do campo de texto e o passa para a classe <tt>updateStatus</tt>. Observe a chamada a <tt>makeOAuthRequestUnique</tt>. O código chama esse método porque a aplicação já está conectada e autenticada pelas chamadas de <tt>initUserInfo</tt> a <tt>login</tt> e <tt>initOAuth</tt> quando a aplicação é inicializada. O método <tt>makeOAuthRequestUnique</tt> aumenta os parâmetros OAuth nonce e timestamp para tornar cada solicitação única.</p> |
| <p class="alert"><b>Cuidado:</b> não está totalmente claro se aqui é melhor chamar a <tt>makeOAuthRequestUnique</tt> ou a <tt>initOAuth</tt>. Se tiver problemas de autenticação, tente as duas formas.</p> |
| <p>Observe também que a chamada a <tt>updateStatus</tt> está encapsulada em um bloco try/catch. Isso ajuda você a depurar quaisquer problemas que surjam ao chamar <tt>updateStatus</tt>.</p> |
| <h2><a name="public-timeline-autoupdate"></a>Exibindo Nomes de Usuário e Status no JFrame</h2> |
| <p>Agora você configura a aplicação para exibir os nomes de usuários e os status dos amigos do Twitter. </p> |
| <ul> |
| <li>Para obter os nomes de usuário e os status do Twitter, a aplicação chama a operação <tt>getFriendsTimeline</tt> do Twitter quando a aplicação é executada. Para configurar isso, <a href="#add-run">crie um novo método de execução</a> que substitui o método <tt>run</tt> no <tt>main</tt>. Insira chamadas a <tt>getFriendsTimeline</tt> neste método.</li> |
| <li>Para que a exibição seja automaticamente atualizada, <a href="#timer-task">encapsule o método de execução</a> que contém a operação <tt>getFriendsTimeline</tt> em um <tt><a href="http://java.sun.com/javase/6/docs/api/java/util/TimerTask.html" target="_blank">java.util.TimerTask</a></tt> que executa o método <tt>run</tt> a cada 75 segundos.</li> |
| <li>A aplicação exibe os dados como células em uma lista. Você precisa passar os dados para os componentes da GUI que possam ser renderizados como células na lista e também precisará formatar a exibição dos dados. Para isso, <a href="#listcellrenderer">crie um novo JPanel</a> que implementa o <tt><a href="http://java.sun.com/javase/6/docs/api/javax/swing/ListCellRenderer.html" target="_blank">javax.swing.ListCellRenderer</a></tt>. Esse JPanel retorna um objeto <tt><a href="http://java.sun.com/javase/6/docs/api/java/awt/Component.html" target="_blank">java.awt.Component</a></tt> com o nome de usuário e status passados no JLabels. Troque o formato do JPanel. </li> |
| <li>No TwitterJFrame, <a href="#display-component">configure o JList</a> para exibir os objetos Componente retornados pelo JPanel. </li> |
| </ul> |
| <div class="indent"> |
| <h3><a name="timer-task"></a>Criando um TimerTask</h3> |
| <p>Para atualizar automaticamente a exibição da linha de tempo dos amigos do Twitter, encapsule o código de execução em um TimerTask. Primeiro escreva o encapsulador TimerTask e, em seguida, preencha-o com o código de execução. Caso contrário, seu código estará repleto de advertências de erros.</p> |
| <p><strong>Para criar o TimerTask:</strong></p> |
| <ol> |
| <li>Abra o TwitterJFrame na view Código-fonte do editor.</li> |
| <li>Encontre a declaração de classe e o construtor. |
| <pre class="examplecode">public class TwitterJFrame extends javax.swing.JFrame { |
| |
| /** Creates new form TwitterJFrame */ |
| public TwitterJFrame() { |
| initComponents(); |
| try { |
| initUserInfo(); |
| } catch (IOException ex) { |
| Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); |
| } |
| }</pre> |
| </li> |
| <li>No corpo do método do construtor, acima de <tt class="examplecode">initComponents();</tt>, instancie a classe <tt><a href="http://java.sun.com/javase/6/docs/api/java/util/Timer.html" target="_blank">java.util.Timer</a></tt>. O parâmetro nomeia o thread <tt>Timer</tt> "Atualizador do Twitter" e especifica que não pode ser executado como um daemon. |
| |
| <pre class="examplecode">public class TwitterJFrame extends javax.swing.JFrame { |
| |
| /** Creates new form TwitterJFrame */ |
| public TwitterJFrame() {<strong> |
| Timer t = new Timer("Twitter Updater`", false);</strong> |
| initComponents(); |
| try { |
| initUserInfo(); |
| } catch (IOException ex) { |
| Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); |
| } |
| } |
| </pre> |
| </li> |
| <li>Clique com o botão direito do mouse em qualquer lugar do editor e selecione Corrigir Importações no menu de contexto ou pressione Ctrl/⌘-Shift-I. Uma caixa de diálogo será aberta e oferecerá opções de classes para importar. Adicione uma instrução de importação para <tt>java.util.Timer</tt>.</li> |
| <li>Abaixo da instanciação de <tt>Timer</tt>, crie um novo método <tt>Timer.scheduleAtFixedRate</tt>. Os parâmetros do método são um objeto <tt>TimerTask</tt>, o atraso antes que execute a tarefa pela primeira vez e a frequência na qual ele executa a tarefa. Defina o método para esperar 30 segundos antes de ser executado pela primeira vez e ser executado novamente a cada 75 segundos. (O longo atraso inicial tem a finalidade de dar-lhe tempo para efetuar log-in.) O código exato se encontra a seguir, em negrito. Uma linha vazia é deixada onde você coloca o código de execução. Observe que você tem que adicionar uma instrução de importação para <tt>java.util.TimerTask</tt>. |
| <pre class="examplecode">public class TwitterJFrame extends javax.swing.JFrame { |
| |
| /** Creates new form TwitterJFrame */ |
| public TwitterJFrame() { |
| Timer t = new Timer("Twitter Updater`", false);<strong> |
| t.scheduleAtFixedRate(new TimerTask() {<br><br> |
| }, 30000, 75000);</strong> |
| initComponents(); |
| try { |
| initUserInfo(); |
| } catch (IOException ex) { |
| Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); |
| } |
| }</pre> |
| </li> |
| </ol> |
| <p>A encapsulador <tt>TimerTask</tt> do código agora está concluído. Em seguida, você adiciona o código de execução.</p> |
| <h3><a name="add-run"></a>Adicionando um método <tt>run</tt> com a operação <tt>getFriendsTimeline</tt></h3> |
| <p>Para exibir nomes de usuário e status, a aplicação obtém primeiro esses dados do Twitter. O Twitter SaaS fornece a operação <tt>getFriendsTimeline</tt> para obter nomes de usuário e status. Para executar a operação <tt>getFriendscTimeline</tt> quando a aplicação é executada, a operação precisa estar dentro de um método <tt>run</tt>. Finalmente, como a aplicação exibe os nomes de usuário e status em uma JList, ela precisa adicionar os resultados de <tt>getFriendsTimeline</tt> como elementos de um objeto <tt><a href="http://java.sun.com/javase/6/docs/api/javax/swing/DefaultListModel.html" target="_blank">DefaultListModel</a></tt>. </p> |
| <p><strong>Para adicionar um método de execução com a operação getFriendsTimeline:</strong></p> |
| <ol> |
| <li>Acima do construtor TwitterJFrame, crie um objeto <tt>DefaultListModel</tt> denominado <tt>statusListModel</tt>. |
| <pre class="examplecode">public class TwitterJFrame extends javax.swing.JFrame { |
| |
| <strong>private DefaultListModel statusesListModel = new DefaultListModel();</strong> |
| <br> |
| /** Creates new form TwitterJFrame */ |
| public TwitterJFrame() { |
| </pre> |
| </li> |
| <li>Clique com o botão direito do mouse em qualquer lugar do editor e selecione Corrigir Importações no menu de contexto ou pressione Ctrl/⌘-Shift-I. Essa ação adiciona uma instrução de importação a <tt>DefaultListModel</tt>.</li> |
| <li>No corpo do objeto <tt>TimerTask</tt>, crie um novo método <tt>run</tt>. Use a anotação <tt>@Override</tt> para substituir o método <tt>run</tt> em <tt>main</tt>. |
| <pre class="examplecode">public class TwitterJFrame extends javax.swing.JFrame { |
| |
| private DefaultListModel statuses = new DefaultListModel();<br><br> |
| |
| |
| |
| /** Creates new form TwitterJFrame */ |
| public TwitterJFrame() { |
| Timer t = new Timer("Twitter Updater`", false);<br> t.scheduleAtFixedRate(new TimerTask() {<br> <strong> @Override</strong><br> <strong>public void run(){<br> <br> }</strong><br> }, 1500, 75000);<br> initComponents(); |
| try { |
| initUserInfo(); |
| } catch (IOException ex) { |
| Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); |
| } |
| </pre> |
| </li> |
| <li>Insira o seguinte código <tt></tt> no corpo do método <tt>run</tt>. |
| <pre class="examplecode">@Override |
| public void run() { |
| <strong>System.out.println("Timer Task is running"); |
| try { |
| client.initOAuth(); |
| Statuses response = client.getFriendsTimeline(Statuses.class, null, null, null, "10"); |
| // Clear the list model so it does not replicate the contents from the last run |
| statusesListModel.clear(); |
| // Create a Status Type object for every status in the Status list, and add an element |
| // to the list model for every status type object |
| for (final StatusType st : response.getStatus()) { |
| SwingUtilities.invokeLater(new Runnable() { |
| public void run() { |
| statusesListModel.addElement(st); |
| } |
| }); |
| } |
| } catch (UniformInterfaceException ex) { |
| System.out.println("Exception when calling getFriendsTimeline = " + ex.getResponse().getEntity(String.class)); |
| } |
| </strong>}</pre> |
| </li> |
| |
| </ol> |
| <p>O código para obter o status da linha de tempo dos amigos do Twitter agora está concluído. em seguida, você escreve uma nova classe que retorna um <tt>Componente</tt> com elementos de lista renderizados em componentes da GUI.</p> |
| <h3><a name="listcellrenderer"></a>Criando um Componente de Renderização da Célula da Lista</h3> |
| <p>Agora você tem o código que obtém os objetos <tt>Status</tt> da Linha de Tempo dos Amigos do Twitter e que cria um elemento de lista para cada status. No entanto, você não pode exibir esses elementos de lista bruta em uma JList. É preciso passar os dados para os componentes da GUI. Para isso, crie um novo JPanel que implementa <tt><a href="http://java.sun.com/javase/6/docs/api/javax/swing/ListCellRenderer.html" target="_blank">javax.swing.ListCellRenderer</a></tt>. Este JPanel retorna um objeto <tt><a href="http://java.sun.com/javase/6/docs/api/java/awt/Component.html" target="_blank">java.awt.Component</a></tt> com o nome de usuário e status passados no JLabels. Você pode personalizar a aparência dos JLabels no JPanel. </p> |
| <p><strong>Para adicionar um Componente de renderização da célula da lista:</strong></p> |
| <ol> |
| <li>Clique com o botão direito do mouse no nó do projeto e selecione Novo > Form JPanel. O assistente Novo Form JPanel será aberto.</li> |
| <li>Nomeie o JPanel como <tt>Item</tt> e coloque-o no pacote <tt>twitterclient</tt>. <br> <img alt="Assistente Novo Form JPanel que mostra o painel de nome Item e o pacote twitterclient" border="1" class="margin-around" height="286" src="../../../images_www/articles/72/websvc/twitter-swing/create-jpanel-form.png" width="600"></li> |
| <li>Clique em Finalizar. O <tt>Item.java</tt> será aberto na view de Design do editor. </li> |
| <li>Arraste e solte um Label e um Painel de Texto no JPanel. O Label exibirá o nome de usuário e o Painel de Texto exibirá a mensagem de status daquele usuário.</li> |
| <li>Posicione o Label e o Painel de Texto para que estejam de acordo com as suas preferências de exibição dos dados. Na imagem a seguir, o nome de usuário está no canto esquerdo superior e o texto do status está abaixo e um pouco recuado. O projeto de <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FWeb%2520Services%252FTwitterSwingClient.zip" target="_blank">amostra</a> tem os dados no canto esquerdo superior e o nome de usuário no canto inferior direito. Deixe espaço vazio suficiente no JPanel abaixo do Painel de Texto para que ele possa ser expandido quando contiver texto mais longo.<br> <img alt="Layout de jlabels que exibem o nome de usuário e o texto de status" class="margin-around b-all" height="198" src="../../../images_www/articles/72/websvc/twitter-swing/item-layout.png" width="425"></li> |
| <li>Clique com o botão direito do mouse no elemento jLabel e selecione Propriedades no menu de contexto. Em Propriedades, é possível alterar a fonte, a cor, o alinhamento e outras qualidades. Defina a propriedade <tt>labelFor</tt> para apontar para jTextPane1. Isso aprimora a acessibilidade. Teste as propriedades do label até estar satisfeito com a aparência. Na imagem a seguir, a cor da fonte está definida como azul na propriedade Primeiro plano. <br> <img alt="Caixa de diálogo propriedades do JLabel com o Primeiro plano definido como azul" border="1" class="margin-around" height="527" src="../../../images_www/articles/72/websvc/twitter-swing/item-label-color.png" width="557"></li> |
| <li>Abra a caixa de diálogo Propriedades do JTextPane e faça experiências com sua aparência.</li> |
| <li>Alterne para a view Código-fonte de <tt>Item.java</tt>. Localize o bloco Código Gerado e expanda-o. Isso mostra o código gerado pelo IDE quando você define as propriedades do JLabel e do JTextPane. |
| <p>Na imagem a seguir, observe a definição da cor azul para JLabel1. Você pode ver quais propriedades estão definidas para o JTextPane?</p> |
| <img alt="Código gerado em Item.java pela definição das propriedades de JLabel na view de Design" class="margin-around b-all" height="350" src="../../../images_www/articles/72/websvc/twitter-swing/item-generated-code.png" width="592"></li> |
| <li>Encontre a declaração de classe e adicione o código <tt class="examplecode">implements ListCellRenderer</tt>. |
| <pre class="examplecode">public class Item extends javax.swing.JPanel <strong>implements ListCellRenderer</strong> {</pre> |
| </li> |
| <li>Pressione Ctrl-Shift-I (⌘-Shift-I no MacOS). Essa ação adiciona uma instrução de importação a <tt>javax.swing.ListCellRenderer</tt>. Aparece uma advertência informando ser necessário implementar todos os métodos abstratos. </li> |
| <li> Adicione algumas linhas vazias entre o bloco de código gerado e as declarações de variáveis. Nesse espaço, adicione o seguinte código, que implementa o método abstrato <tt>getListCellRendererComponent</tt>. (Você pode copiar e colar o código ou pode tentar reproduzi-lo com a funcionalidade autocompletar código). Esse código substitui os textos de label default "nome de usuário" e "texto" pelos objetos Text, User e ScreenName, obtidos com a classe twitteroauth StatusType. Em seguida, o código retorna uma instância de Component com esses novos valores de texto do JLabel. |
| <pre class="examplecode">public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) { |
| StatusType st = (StatusType) value; |
| jTextPane1.setText(st.getText()); |
| jLabel1.setText("<html>" + st.getUser().getScreenName() + "</html>"); |
| return this; |
| }</pre> |
| </li> |
| <li>Pressione Ctrl-Shift-I (⌘-Shift-I no MacOS). Isso adiciona instruções de importação das classes StatusType e Component. Selecione a versão twitteroauth de StatusType. Salve Item.java.</li> |
| </ol> |
| <p>Agora você tem uma classe Item que retorna um objeto Component com o nome de usuário e status exibidos em um JLabel e em um JTextPane. Em seguida, você modifica TwitterJFrame para usar esse componente.</p> |
| |
| <h3><a name="display-component"></a>Exibindo o Componente no TwitterJFrame</h3> |
| <p>Para poder exibir o objeto Component criado em Item.java, a JList no TwitterJFrame tem que usar Item.java como seu renderizador de célula. </p> |
| <ol> |
| <li>Retorne ao TwitterJFrame. Na view de Design, selecione a JList. Clique com o botão direito do mouse e abra suas Propriedades. <br><img alt="Caixa de diálogo Propriedades do elemento JList no TwitterJFrame" class="margin-around b-all" height="462" src="../../../images_www/articles/72/websvc/twitter-swing/jlist-properties.png" width="460"></li> |
| <li>Selecione a propriedade <tt>modelo</tt>. Pressione Ctrl-Espaço. O editor de propriedade personalizada será aberto, mostrando o texto default exibido na lista. <br><img alt="Editor de propriedades personalizadas do J list" class="b-all margin-around" height="265" src="../../../images_www/articles/72/websvc/twitter-swing/jlist-custom-editor.png" width="458"></li> |
| <li>No menu drop-down "Definir a propriedade do modelo jLlist1 usando:" selecione Código Personalizado. Aparecerá um campo de texto onde você digita as propriedades de <tt>jLabel1.setModel</tt>. Digite <tt>statusesListModel</tt> no campo e clique em OK. <br><img alt="Editor de propriedade personalizada do jList que mostra setModel(statuses) escolhido no editor de código personalizado" class="margin-around" height="341" src="../../../images_www/articles/72/websvc/twitter-swing/jlist-model.png" width="433"> |
| <li>Na caixa de diálogo Propriedades, selecione cellRenderer e pressione Ctrl-Espaço. O editor de propriedade personalizada será aberto.</li> |
| <li>No menu drop-down "Definir a propriedade cellRenderer do jList1 usando:" selecione Código Personalizado. Aparecerá um campo de texto em que você digita as propriedades de <tt>jList1.cellRenderer</tt>. Digite<tt> new Item()</tt> e clique em OK. <br><img alt="Editor de propriedades do renderizador de célula personalizada do J List que mostra o novo Item escolhido" class="margin-around" height="221" src="../../../images_www/articles/72/websvc/twitter-swing/jlist-custom-cell-renderer.png" width="498"></li> |
| </ol> |
| |
| <p>Sua aplicação cliente agora está completa! Salve todos os arquivos e execute a aplicação. (Clique com o botão direito do mouse no nó do projeto e selecione Executar). A aplicação será aberta, mostrando uma lista de mensagens de linha de tempo e um campo com seu próprio status.</p> |
| <img alt="Cliente em execução que exibe mensagens do Twitter" class="margin-around" height="374" src="../../../images_www/articles/72/websvc/twitter-swing/client-display.png" width="570"> </div> |
| <h2><a name="connecting-proxy"></a>Conectando por meio de um Proxy;</h2> |
| |
| |
| <p>Se estiver se conectado à Internet por meio de um proxy, será necessário configurar o IDE e seu projeto TwitterSwingClient para usar as definições do proxy.</p> |
| <p>Para configurar o IDE, abra Ferramentas > Opções > Geral. Localize a seção Definições de Proxy. Você tem as opções de não usar nenhuma definição de proxy, usar as definições de proxy do sistema ou de usar definições manuais de proxy. O IDE obtém as definições de proxy do seu sistema por meio do seu Web browser default.</p> |
| <p>Para o projeto TwitterSwingClient, é preciso especificar o proxy que o handler do protocolo HTTP utiliza. Isso está descrito na <a href="http://java.sun.com/javase/6/docs/technotes/guides/net/proxies.html" target="_blank">documentação do Java SE 6</a>. Você especifica o proxy nas opções passadas para a máquina virtual. Com o NetBeans IDE, essas opções são definidas na caixa de diálogo Propriedades.</p> |
| <p><strong>Para especificar o proxy do projeto TwitterSwingClient:</strong></p> |
| <ol> |
| <li>Na janela Projetos, clique com o botão direito do mouse no nó do projeto TwitterSwingClient e selecione Propriedades. A caixa de diálogo Propriedades será aberta.</li> |
| <li>Na árvore Categorias, selecione Executar. As Propriedades de Execução serão Exibidas:</li> |
| <li>No campo Opções da VM, digite <tt>-Dhttp.proxyHost=server -Dhttp.proxyPort=port</tt>. Substitua "server" e "port" pelo nome do host e a porta de seu servidor proxy! <br><img alt="Definições de proxy e opções da VM na caixa de diálogo Propriedades do projeto" class="margin-around" height="304" src="../../../images_www/articles/72/websvc/twitter-swing/proxy-settings.png" width="600"></li> |
| </ol> |
| |
| <h2><a name="more_exercises"></a>Mais Exercícios</h2> |
| <p>A seguir, encontam-se mais algumas ideias para você explorar:</p> |
| <ul> |
| <li>Altere seu ícone de usuário do Twitter (em um browser) e execute novamente o cliente. O novo ícone aparece?</li> |
| <li>Adicione uma barra de ferramentas com algumas funções no JFrame.</li> |
| </ul> |
| <div class="feedback-box"> |
| <a href="/about/contact_form.html?to=3&subject=Feedback:RESTful%20Swing%20Client%20for%20Twitter">Envie-nos Seu Feedback</a></div> |
| |
| <br style="clear:both;" > |
| <h2><a name="seealso"></a>Consulte Também</h2> |
| <p>Para obter mais informações sobre como usar o NetBeans IDE para criar e consumir Web services e para criar GUIs, consulte os seguintes recursos: </p> |
| <ul> |
| <li><a href="../../docs/websvc/rest_pt_BR.html">Introdução ao RESTful Web Services</a></li> |
| <li><a href="../../docs/java/quickstart-gui_pt_BR.html">Construindo GUIs no NetBeans IDE</a></li> |
| <li><a href="../../docs/java/gui-image-display_pt_BR.html">Tratando imagens em uma Aplicação da GUI</a></li> |
| <li><a href="../../docs/websvc/jersey-rcp-client_pt_BR.html">Criando Clientes de Serviço RESTful em Módulos do NetBeans</a></li> |
| <li><a href="../../trails/web_pt_BR.html">Trilha do Aprendizado de Web services</a></li> |
| <li><a href="../../trails/matisse_pt_BR.html">Trilha do Aprendizado de Aplicações Java e JavaFX GUI</a></li> |
| </ul> |
| <p>Para enviar comentários e sugestões, obter suporte e se manter informado sobre os mais recentes desenvolvimento das funcionalidades de desenvolvimento de Java EE do NetBeans IDE, <a href="../../../community/lists/top.html">inscreva-se na lista de correspondência nbj2ee@netbeans.org</a>.</p> |
| </body> |
| </html> |