corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Tutorial sobre a criação de um cliente gráfico para o Twitter

Neste tutorial, você usa o NetBeans IDE para criar um cliente gráfico simples com base no REST, que exibe mensagens de linha do tempo dos amigos do Twitter e permite visualizar e atualizar seu status do Twitter. O aplicativo usa o suporte do Swing e do NetBeans IDE para as operações SaaS do Twitter.

Executando um cliente exibindo mensagens do Twitter

Se não tiver uma conta do Twitter, vá ao twitter.com e crie uma conta antes de prosseguir com este tutorial.

Uma amostra completa deste aplicativo está disponível para download. Clique aqui para fazer o download da amostra.

Conteúdo

O conteúdo desta página se aplica ao IDE NetBeans 6.9-7.0

Para concluir este tutorial, você precisa dos seguintes recursos e softwares.

Software ou recurso Versão necessária
NetBeans IDE Pacote de download do Java EE
Java Development Kit (JDK) Versão 6
Nome de usuário e senha para uma conta do Twitter

Projetando o JFrame

Nesta etapa, você cria os elementos da GUI que exibem 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 colocados em um JFrame. 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 todos os elementos descritos neste tutorial.

Para projetar o JFrame:

  1. Escolha Arquivo > Novo projeto. O assistente para novo projeto é aberto. Selecione a categoria Java e, em seguida, um projeto de aplicativo Java. Clique em Próximo.
  2. Nomeie o projeto como TwitterSwingClient. Selecione uma localização para o projeto. Desmarque Criar classe principal. (O JFrame será a classe principal). Clique em Terminar.
    Assistente Novo projeto mostrando os campos para criar o projeto TwitterSwingClient
  3. 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 escolha Novo > Formulário JFrame (ou Novo > Outro > Formulários da GUI Swing > Formulário JFrame). O assistente Novo formulário JFrame é aberto.
  4. Nomeie o formulário TwitterJFrame e crie um pacote para o mesmo denominado twitterclient. Clique em Terminar.
    Assistente Novo formulário JFrame mostrando os campos para criar TwitterJFrame
  5. O IDE abre o TwitterJFrame no editor na visualização Desenho. Aqui você tem uma paleta de todos os componentes Swing que podem ser arrastados e soltos no JFrame.
    Twitter J Frame na visualização Desenho do editor
  6. Clique no ícone Botão em Controles Swing na paleta. Arraste e solte-o no canto inferior direito do JFrame. Observe que o botão exibe jButton1, que é o nome deste objeto JButton.
    JFrame mostrando o jButton1 recém-adicionado
  7. Clique com o botão direito do mouse em jButton1 e selecione Editar texto no menu de contexto. Altere o texto exibido para "Atualizar".
  8. Arraste e solte um rótulo (jLabel1) no canto inferior esquerdo do JFrame. Altere o texto exibido para "Ícone". Seu ícone de usuário será exibido neste rótulo.
  9. Arraste e solte um campo de texto (jTextField1) entre o rótulo e o botão. Altere o texto exibido para "Status". Clique na borda direita do campo de texto e estique-a em direção ao botão. Linhas guia azuis aparecem mostrando as distâncias sugeridas do botão.
  10. Clique com o botão direito do mouse em jLabel1 e selecione Propriedades no menu de contexto. A caixa de diálogo jLabel1 é aberta. Defina a propriedade labelFor para apontar para jTextField1. (Isso aumenta a acessibilidade).
  11. Encontre as propriedades Tamanho máximo, Tamanho mínimo e Tamanho preferido. Defina cada uma destas propriedades como [48,48], para que correspondam com as dimensões 48px X 48px dos ícones do Twitter.
    Propriedades do j Label 1 no Twitter J Frame, mostrando os tamanhos máximo, mínimo e preferido definidos como 48, 48
  12. 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 amostra).
  13. Arraste e solte a lista no painel de rolagem. Aparece uma lista de amostra de itens. Salve o TwitterJFrame. O JFrame deveria se parecer com a seguinte imagem:
    Twitter J Frame na visualização Desenho do editor com todos os elementos básicos da GUI

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).

Mostrando seu status de usuário

Nesta seção você cria um novo método e adiciona a operação Twitter getUserTimeline neste 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 no construtor do JFrame para inicializar o método.

Para mostrar seu status de usuário:

  1. Alterne para a visualização Código-fonte do TwitterJFrame.
  2. 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 é exibido.
    Menu de códigos para inserção no método initUserInfo
  3. Clique em Gerar cliente REST. A caixa de diálogo Recursos REST disponíveis é aberta.
    Caixa de diálogo Recursos REST disponíveis
  4. 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.
    Janela Serviços com a árvore dos Serviços Web mostrando a operação Twitter getUserTimelineById escolhida
  5. A caixa de diálogo Recursos REST disponíveis agora mostra o recurso user_timeline selecionado do Twitter OAuth, o nome da classe correspondente e o tipo de autenticação do OAuth. Clique em OK.
    Caixa de diálogo Recursos REST disponíveis preenchida
  6. Uma caixa de diálogo é aberta perguntando se você deseja gerar objetos Java das referências de esquema XML no arquivo WADL. Clique em Sim.
  7. No final da classe TwitterJFrame, o IDE gera uma classe interna chamada Twitter_OAuth_user_timeline__format_JerseyClient.

    A classe interna é complexa e contém os seguintes campos, métodos e classes internas:

    • CONSUMER_KEY: string de consumer key
    • CONSUMER_SECRET: string de consumer secret
    • initOAuth(): método para inicialização do OAuth
    • getUserTimeline(): método correspondente ao método HTTP: getUserTimeline (do recurso REST)�‚ 
    • makeOAuthRequestUnique(): útil para várias chamadas de API em uma sessão
    • login: usado para efetuar logon no aplicativo Twitter (força a autenticação). Este método chama mais dois métodos gerados, getOAuthAccessToken e getOAuthRequestToken.

    Esta é a estrutura da classe conforme mostrada na janela do navegador.

    Janela do navegador mostrando a classe Twitter_OAuth_user_timeline__format_JerseyClient
  8. No TwitterJFrame imediatamente acima da classe interna Twitter_OAuth_user_timeline__format_JerseyClient, insira a seguinte linha de código. Este código cria uma variável chamada client para representar uma instância da classe interna.
    private Twitter_OAuth_user_timeline__format_JerseyClient client;
    Trecho de código mostrando a variável client imediatamente acima da classe interna
  9. Localize o método main no TwitterJFrame. Acima deste método, crie um novo método chamado initUserInfo que lança uma MalformedURLException e uma IOException.
    private void initUserInfo() throws MalformedURLException, IOException {
    
    
    
    }
  10. Insira o código seguinte no corpo do método de initUserInfo. Os comentários no código explicam o que o código faz.
    private void initUserInfo() throws MalformedURLException, IOException {
    
    //Criar uma instância da classe de serviço interna client = new Twitter_OAuth_user_timeline__format_JerseyClient("xml");
    //Efetuar logon, obter tokens e anexar os tokens às chaves consumer key e //consumer secret client.login(); client.initOAuth();
    //Chamar getUserTimeline, obter uma lista de status, passar os status //mais recentes como um objeto StatusType e exibir o texto de tal objeto //no JTextField Statuses statuses = client.getUserTimeline(Statuses.class, null, null, null, "1"); StatusType st = statuses.getStatus().get(0); jTextField1.setText(st.getText().trim());
    //Obter um objeto UserType do objeto StatusType, obter a URL de tal //ícone do usuário e exibir ta ícone no JLabel UserType user = st.getUser(); String iconSrc = user.getProfileImageUrl(); URL iconUrl = new URL(iconSrc); ImageIcon icon = new ImageIcon(iconUrl, user.getScreenName()); jLabel1.setIcon(icon); }
  11. 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 padrão StatusType.
    A caixa de diálogo Corrigir importações após a conclusão do método initUserInfo
  12. Adicione um bloco try/catch ao construtor TwitterJForm para chamar initUserInfo quando o aplicativo for executado. Corrija as importações após adicionar o bloco try/catch.
    public TwitterJFrame() {
        initComponents();
    
        try {
            initUserInfo();
        } catch (IOException ex) {
            Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
     }

Depois de obter as chaves OAuth do Twitter, o projeto pode ser executado. Clique com o botão direito do mouse no nó do projeto e selecione Executar a partir do menu de contexto. Um aplicativo é aberto mostrando seu ícone e status de usuário.

Obtendo as chaves OAuth do Twitter

Para que o aplicativo 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 destas 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 "falsa".

Para obter as chaves OAuth do Twitter:

  1. Abra o navegador. Vá à página Twitter > Aplicativos e clique em Registrar um novo aplicativo �‚». É necessário efetuar logon na conta do Twitter. Certifique-se de ter efetuado logon na conta correta caso você tenha várias contas.
  2. Digite Aplicativo Linha do tempo do usuário do NB no campo de texto Nome do aplicativo.
  3. Digite uma descrição no campo Descrição. É necessário digitar uma descrição. Você pode colocar, por exemplo, "Aplicativo Java criado no NetBeans IDE chamando a operação user_timeline".
  4. Digite uma URL arbitrária no campo Site do aplicativo.
  5. Na opção Tipo de aplicativo, selecione o botão de opção Cliente.
  6. Na seção Tipo de acesso padrão, selecione o botão Ler e escrever.

    Cuidado: certifique-se de ter selecionado Ler e escrever. Embora seja possível voltar e editar as configurações mais tarde, parece que isso não afeta os privilégios de acesso do aplicativo.

  7. Deixe as outras opções como padrão e clique em Salvar. A página do navegador se abre com os detalhes do aplicativo que você registrou. Os detalhes importantes são consumer key e consumer secret.
  8. Copie a consumer key do navegador. No IDE, localize a linha onde a CONSUMER_KEY está definida. Cole o valor da consumer key entre as aspas.
    TwitterClient mostrando a localização de CONSUMER_KEY e CONSUMER_SECRET
  9. Copie a chave consumer secret do navegador e cole-a no TwitterSwingClient. Salve as alterações.

Executando o projeto

Agora que já tem as chaves consumer key e consumer secret, pode executar o projeto. O aplicativo chama o Twitter, que abre a janela do navegador para que você permita que o aplicativo acesse os dados.

Para executar o projeto:

  1. 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.
  2. Uma janela do navegador é exibida perguntando se você deseja permitir que o aplicativo registrado acesse seus dados do Twitter. Clique em Permitir.
  3. A janela do navegador é atualizada para uma nova janela que mostra um PIN. Copie este PIN.
  4. 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.
    Janela Saída do IDE solicitando a string de verificação, que ainda não foi colada
  5. O cliente da área de trabalho se abre, exibindo sua última mensagem de status no Twitter.
    Aplicativo em execução mostrando seu ícone e status de usuário

Chamando vários serviços

O desenho final do aplicativo requer chamadas a três serviços do Twitter: user_timeline{format} (já chamado), update{format} e friends_timeline{format}. As chamadas a estes serviços precisam compartilhar um logon. Para que as chamadas compartilhem o mesmo logon, elas devem estar na mesma classe do cliente. A chamada a vários serviços a partir de um cliente requer duas etapas:

  • Adicionar vários serviços a uma classe do cliente.
  • Modificar os caminhos de recurso na classe do cliente

Adicionando serviços e combinando chamadas em uma classe

Nesta seção, você primeiro adiciona clientes de outros serviços e os combina em um cliente geral.

Para adicionar vários serviços:

  1. Pressione Alt-Insert e selecione Gerar cliente REST.
    Menu de códigos para inserção no método initUserInfo
  2. Para gerar um cliente REST, siga o mesmo procedimento da seção Mostrando seu status de usuário, mas selecione o serviço [statuses] > [update.{format}]. O IDE gera a classe interna Twitter_OAuth_update__format_JerseyClient, que é semelhante à classe Twitter_OAuth_user_timeline__format_JerseyClient.
    Caixa de diálogo Recursos REST disponíveis mostrando o serviço [update.{format}]
  3. Repita as etapas 1 e 2 acima, mas adicione um cliente ao serviço friends_timeline.{format}].
  4. Altere o nome da classe original Twitter_OAuth_user_timeline__format_JerseyClient. Você transformará esta 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 se abre. Digite o novo nome TwitterClient.
    Caixa de diálogo Renomear classe com o novo nome TwitterClient
  5. Clique em Refatorar. O IDE substitui todas as instâncias do nome de classe.
    Nome de classe alterado em vários lugares
  6. Na janela Navegador, localize a classe Twitter_Oauth_friends_timeline__format_JerseyClient. Em tal classe, localize e clique duas vezes no método getFriendsTimeline.
    Janela Navegador mostrando o método getPublicTimeline
  7. O cursor do Editor se move para o método getFriendsTimeline. Recorte tal método (reproduzido abaixo).
    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);
    }
  8. Cole o método getFriendsTimeline na classe interna TwitterClient, abaixo do método getUserTimeline.
  9. Recorte e cole o método updateStatus do Twitter_OAuth_update__format_JerseyClient em TwitterClient, abaixo do método getFriendsTimeline.

Modificando os caminhos do recurso

Todas as chamadas de serviços do Twitter estão agora em uma classe do cliente. No entanto, os caminhos do recurso desta classe do cliente não estão construídos corretamente. O IDE gera os caminhos de 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 de recurso seja genérico e os caminhos específicos sejam atribuídos pelos métodos de chamada de serviço.

Para modificar os caminhos do recurso:

  1. Localize o construtor TwitterClient e remova o parâmetro String format.
    Visualização de antes e depois da remoção do parâmetro do construtor
  2. É exibida uma barra vermelha de erros na margem direita. Ao clicar nela, você será levado à linha do initUserInfo que cria instâncias da classe TwitterClient. Esta linha é client = new TwitterClient("xml");. Exclua o parâmetro "xml", pois o construtor TwitterClient já não o utiliza. A linha agora é client = new TwitterClient();. Os ícones de erro desaparecem.
  3. Volte ao construtor TwitterClient. (A janela Navegador pode ajudá-lo.) Localize a seguinte linha:
    String resourcePath = java.text.MessageFormat.format("statuses/user_timeline.{0}", new Object[]{format}); 

    Esta linha define o resourcePath de toda a classe. Altere a linha para que resourcePath leve ao diretório principal statuses. A linha agora fica assim:

    String resourcePath = "statuses";
  4. Vá ao método getUserTimeline. Localize a linha return:
    return webResource.queryParams(getQueryOrFormParams(queryParamNames, queryParamValues))...;

    Anexe informações do caminho (em negrita, abaixo) ao início da chamada.

    return webResource.path("user_timeline.xml").queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);
  5. Vá ao método getFriendsTimeline. Localize a linha return:
    return webResource.queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);

    Anexe informações do caminho ao início da chamada.

    return webResource.path("friends_timeline.xml").queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);
  6. Vá ao método updateStatus. Localize a linha return:
    return webResource.type(javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED)...

    Anexe informações do caminho ao início da chamada.

    return webResource.path("update.xml").type(javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED).post(responseType, getQueryOrFormParams(formParamNames, formParamValues));
  7. Localize e comente o método setResourcePath do TwitterClient. Ele nunca é chamado, mas recomenda-se fazê-lo como precaução.
  8. Exclua as classes Twitter_OAuth_update__format_JerseyClient e Twitter_Oauth_friends_timeline__format_JerseyClient.

Agora há três serviços disponíveis na classe JerseyClient.

Importante: são alteradas três instruções return em três métodos no procedimento acima. Certifique-se de ter alterado as três!

Adicionando uma ação de atualização de status

  1. Retorne à visualização Desenho do TwitterJFrame. Clique duas vezes no botão Atualizar no JFrame. O editor volta para a visualização Código-fonte, no corpo do método jButton1ActionPerformed, que o IDE acaba de criar para você.
    TwitterJFrame na visualização Código-fonte, com o cursor no meio do método jButton1ActionPerformed recém-criado
  2. Preencha o corpo do método jButton1ActionPerformed da seguinte forma:

    Cuidado: 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, o aplicativo 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 através do link para envio de comentários na parte inferior do tutorial.

    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));
        }
    
    }    

Este código obtém o texto do campo de texto e o passa para a classe updateStatus. Observe a chamada a makeOAuthRequestUnique. O código chama este método porque o aplicativo já é conectado e autenticado pelas chamadas de initUserInfo a login e initOAuth quando o aplicativo é inicializado. O método makeOAuthRequestUnique aumenta os parâmetros existentes de carimbo de data/hora e de uso exclusivo do OAuth para tornar cada solicitação única.

Cuidado: não está totalmente claro se aqui é melhor chamar a makeOAuthRequestUnique ou a initOAuth. Se tiver problemas de autenticação, tente as duas formas.

Observe também que a chamada a updateStatus está dentro de um bloco try/catch. Isso ajuda você a depurar quaisquer problemas que surjam ao chamar updateStatus.

Exibindo nomes de usuário e status no JFrame

Agora você configura o aplicativo para exibir os nomes de usuários e os status dos amigos do Twitter.

Criando um TimerTask

Para atualizar automaticamente a exibição da linha de tempo dos amigos do Twitter, coloque o código de execução em um TimerTask. Primeiro escreva o TimerTask e então preencha-o com o código de execução. Caso contrário, seu código estará repleto de avisos de erros.

Para criar o TimerTask:

  1. Abra o TwitterJFrame na visualização Código-fonte do editor.
  2. Encontre a declaração de classe e o construtor.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        /** Cria novo formulário TwitterJFrame */
        public TwitterJFrame() {
            initComponents();
            try {
                initUserInfo();
            } catch (IOException ex) {
                Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
  3. No corpo do método do construtor, acima de initComponents();, crie a instância da classe java.util.Timer. O parâmetro nomeia o segmentoTimer "Atualizador do Twitter" e especifica que não pode ser executado como um domínio.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        /** Cria novo formulário TwitterJFrame */
        public TwitterJFrame() {
            Timer t = new Timer("Twitter Updater`", false);
            initComponents();
            try {
                initUserInfo();
            } catch (IOException ex) {
                Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
                        
  4. Clique com o botão direito do mouse em qualquer lugar no editor e selecione Corrigir importações no menu de contexto ou pressione Ctrl-Shift-I. Uma caixa de diálogo é aberta e lhe oferece a opção de classes para a importação. Adicione uma declaração para java.util.Timer.
  5. Abaixo da instância de Timer, crie um novo método Timer.scheduleAtFixedRate. Os parâmetros do método são um objeto TimerTask, o atraso antes que execute a tarefa por primeiro, e a frequência na qual ele executa a tarefa. Defina o método para esperar 30 segundos antes de executar pela primeira vez e executar novamente a cada 75 segundos. (O longo atraso inicial tem a finalidade de dar-lhe tempo para efetuar logon.) 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 de adicionar uma declaração de importação para java.util.TimerTask.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        /** Cria novo formulário TwitterJFrame */
        public TwitterJFrame() {
            Timer t = new Timer("Atualizador do Twitter`", false);
            t.scheduleAtFixedRate(new TimerTask() {

    }, 30000, 75000);
    initComponents(); try { initUserInfo(); } catch (IOException ex) { Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); } }

A colocação do código TimerTask agora esta completada. A seguir, você adiciona o código de execução.

Adicionando um método run com a operação getFriendsTimeline

Para exibir nomes de usuário e status, o aplicativo obtém primeiro estes dados do Twitter. O Twitter SaaS fornece a operação getFriendsTimeline para obter nomes de usuário e status. Para executar a operação getFriendscTimeline quando o aplicativo é executado, a operação precisa estar dentro de um método run. Finalmente, como o aplicativo exibe os nomes de usuário e status em uma JList, ele precisa adicionar os resultados de getFriendsTimeline como elementos de um objeto DefaultListModel.

Para adicionar um método de execução com a operação getFriendsTimeline:

  1. Acima do construtor TwitterJFrame, crie um objeto DefaultListModel denominado statusListModel.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        private DefaultListModel statusesListModel = new DefaultListModel();
    
    /** Cria novo formulário TwitterJFrame */ public TwitterJFrame() {
  2. Clique com o botão direito do mouse em qualquer lugar no editor e selecione Corrigir importações no menu de contexto ou pressione Ctrl-Shift-I. Esta ação adiciona uma declaração de importação para DefaultListModel
  3. No corpo do objeto TimerTask, crie um novo objeto executar. Use a anotação @Override para sobrepor o método run em main.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        private DefaultListModel statuses = new DefaultListModel();

    /** Cria novo formulário TwitterJFrame */ public TwitterJFrame() { Timer t = new Timer("Atualizador do Twitter`", false);
    t.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run(){

    }

    }, 1500, 75000);
    initComponents(); try { initUserInfo(); } catch (IOException ex) { Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); }
  4. Insira o seguinte código no corpo do método run.
    @Override
    public void run() {
        System.out.println("Timer Task está em execução");
        try {
            client.initOAuth();
            Statuses response = client.getFriendsTimeline(Statuses.class, null, null, null, "10");
            // Limpar o modelo da lista de modo que não repita o conteúdo da última execução de 
            statusesListModel.clear();
            // Criar uma objeto Status Type para cada status na lista Status e adicionar um elemento
            // ao modelo da lista para cada objeto status type 
            em (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));
        }
    }

O código para obter o status da linha de tempo dos amigos do Twitter agora está completo. A seguir, você escreve uma nova classe que retorna um Component com elementos listados renderizados em componentes da GUI.

Criando um componente de renderização da célula da lista

Agora você tem o código que obtém os objetos Status 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 estes elementos de lista bruta em uma JList. É preciso passar os dados para os componentes da GUI. Para isso, crie um novo JPanel que implementa javax.swing.ListCellRenderer. Este JPanel retorna um objeto java.awt.Component com o nome de usuário e status passados no JLabels. Você pode personalizar a aparência dos JLabels no painel.

Para adicionar um componente de renderização da célula da lista:

  1. Clique com o botão direito do mouse no nó do projeto e escolha Novo > Formulário JPanel. O assistente Novo formulário JPanel é aberto.
  2. Nomeie o JPanel como Item e coloque-o no pacote twitterclient.
    Assistente Novo formulário JPanel mostrando o painel nomeado como Item e o pacote twitterclient
  3. Clique em Terminar. O Item.java é aberto na visualização Desenho do editor.
  4. Arraste e solte um rótulo e um painel de texto no JPanel. O rótulo exibirá o nome de usuário e o painel de texto exibirá a mensagem de status daquele usuário.
  5. Posicione o rótulo 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 superior esquerdo e o texto do status está abaixo e um pouco indentado. O projeto de amostra tem os dados no canto superior esquerdo e o nome de usuário no canto inferior direito. Deixe espaço vazio suficiente no JPanel abaixo do painel de texto para que este possa ser expandido quando contiver texto mais longo.
    Layout de jlabels exibindo o nome de usuário e o texto do status
  6. 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 labelFor para apontar para jTextPane1. Isso aprimora a acessibilidade. Faça experiências com as propriedades do rótulo até estar satisfeito com a aparência. Na imagem a seguir, a cor da fonte está definida como azul na propriedade Primeiro plano.
    Caixa de diálogo Propriedades do JLabel com Primeiro plano definido como azul
  7. Abra a caixa de diálogo Propriedades do JTextPane e faça experiências com sua aparência.
  8. Alterne para a visualização Código-fonte para Item.java. Localize o bloco Código gerado e expanda o mesmo. Isto mostra o código gerado pelo IDE quando você seleciona as propriedades do JLabel e JTextPane.

    Na imagem a seguir, observe a configuração da cor azul para JLabel1. Você pode ver quais propriedades estão definidas para JTextPane?

    Código gerado no Item.java ao definir as propriedades do JLabel na visualização Desenho
  9. Encontre a declaração de classe e adicione o código implements ListCellRenderer.
    public class Item extends javax.swing.JPanel implements ListCellRenderer {
  10. Pressione Ctrl-Shift-I. Esta ação adiciona uma declaração de importação a javax.swing.ListCellRenderer. Aparece uma aviso informando ser necessário implementar todos os métodos abstratos.
  11. Adicione algumas poucas linhas vazias entre o bloco do código gerado e as declarações de variáveis. Em tal espaço, adicione o seguinte código, que implementa o método abstrato getListCellRendererComponent. (Você pode copiar e colar o código ou pode tentar reproduzi-lo com o recurso autocompletar código). Este código substitui os textos do rótulo padrão "nome de usuário" e "texto" pelos objetos Texto, Usuário e Nome da tela, obtidos com a classe twitteroauth StatusType. O código retorna uma instância do componente com estes novos valores de texto JLabel.
    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;
                        }
  12. Pressione Ctrl-Shift-I. Isso importa declarações para as classes StatusType e Component. Selecione a versão twitteroauth de StatusType. Salve o Item.java.

Agora você tem uma classe Item que retorna um objeto Componente com o nome de usuário e status exibidos em um JLabel e um JTextPane. A seguir, você modifica o TwitterJFrame para usar este componente.

Exibindo o componente no TwitterJFrame

Para poder exibir o objeto Componente criado no Item.java, a JList no TwitterJFrame tem de usar o Item.java como seu renderizador de célula.

  1. Retorne ao TwitterJFrame. Na visualização Desenho, selecione JList. Clique com o botão direito do mouse e abra suas Propriedades.
    Caixa de diálogo Propriedades do elemento JList no TwitterJFrame
  2. Selecione a propriedade modelo. Pressione Ctrl-Espaço. O editor de propriedade personalizada é aberto, mostrando o texto padrão exibido na lista.
    Editor de propriedade personalizada do JList
  3. No menu suspenso "Definir a propriedade do modelo jLlist1 usando:" selecione Código personalizado. Aparece um campo de texto onde você digita as propriedades para jLabel1.setModel. Digite statusesListModel no campo e clique em OK.
    Editor de propriedade personalizada do jList mostrando setModel(status) escolhido no editor de código personalizado
  4. Na caixa de diálogo Propriedades, selecione cellRenderer e pressione Ctrl-Espaço. O editor de propriedade personalizada é aberto.
  5. No menu suspenso "Definir a propriedade cellRenderer do jList1 usando:" selecione Código personalizado. Aparece um campo de texto onde você digita as propriedades para jList1.cellRenderer. Digite new Item() e clique em OK.
    Editor de propriedades de renderização de célula do JList mostrando o novo item escolhido

Seu aplicativo cliente agora está completado! Salve todos os arquivos e execute o aplicativo. (Clique com o botão direito do mouse no nó do projeto e selecione Executar). O aplicativo é aberto, mostrando uma lista de mensagens de linha de tempo e um campo com seu próprio status.

Executando um cliente exibindo mensagens do Twitter

Conectando através do proxy;

Se estiver se conectado à Internet através de um proxy, será necessário configurar o IDE e seu projeto TwitterSwingClient para usar as configurações do proxy.

Para configurar o IDE, abra Ferramentas > Opções > Geral. Localize a seção Configurações do proxy . Você tem as opções de não usar configurações do proxy, usar as configurações do proxy do sistema ou usar configurações manuais do proxy. O IDE obtém as configurações de proxy do seu sistema através do seu navegador Web padrão.

Para o projeto TwitterSwingClient, é preciso especificar o proxy que o manipulador do protocolo HTTP utiliza. Isto está descrito na documentação do Java SE 6. Você especifica o proxy nas opções passadas para a máquina virtual. Com o NetBeans IDE, estas opções são definidas na caixa de diálogo Propriedades.

Para especificar o proxy do projeto TwitterSwingClient:

  1. 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 é aberta.
  2. Na árvore Categorias, selecione Executar. As propriedades de execução são exibidas:
  3. No campo Opções da VM, insira -Dhttp.proxyHost=server -Dhttp.proxyPort=port. Substitua "server" e "port" pelo nome da máquina e porta de seu servidor proxy!
    Configurações do proxy nas Opções da VM na caixa de diálogo Propriedades

Mais exercícios

Aqui estão mais algumas idéias para você explorar:

  • Altere seu ícone de usuário do Twitter (em um navegador) e execute novamente o cliente. O novo ícone aparece?
  • Adicione uma barra de ferramentas com algumas funções no JFrame.

Veja também

Para obter mais informações sobre como usar o NetBeans IDE para criar e consumir serviços Web e para projetar GUIs, consulte os seguintes recursos:

Para enviar comentários e sugestões, obter suporte e se manter informado sobre os mais recentes desenvolvimentos dos recursos de desenvolvimento de Java EE do NetBeans IDE, inscreva-se na lista usuários de .