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.
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.
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:
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.
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.
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.
Nomeie o formulário TwitterJFrame e crie um pacote para o mesmo denominado twitterclient. Clique em Terminar.
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.
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.
Clique com o botão direito do mouse em jButton1 e selecione Editar texto no menu de contexto. Altere o texto exibido para "Atualizar".
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.
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.
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).
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.
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).
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:
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:
Alterne para a visualização Código-fonte do TwitterJFrame.
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.
Clique em Gerar cliente REST. A caixa de diálogo Recursos REST disponíveis é aberta.
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.
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.
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.
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.
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.
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.
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);
}
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.
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.
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".
Digite Aplicativo Linha do tempo do usuário do NB no campo de texto Nome do aplicativo.
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".
Digite uma URL arbitrária no campo Site do aplicativo.
Na opção Tipo de aplicativo, selecione o botão de opção Cliente.
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.
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.
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.
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:
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.
Uma janela do navegador é exibida perguntando se você deseja permitir que o aplicativo registrado acesse seus dados do Twitter. Clique em Permitir.
A janela do navegador é atualizada para uma nova janela que mostra um PIN. Copie este PIN.
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.
O cliente da área de trabalho se abre, exibindo sua última mensagem de status no Twitter.
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:
Pressione Alt-Insert e selecione Gerar cliente REST.
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.
Repita as etapas 1 e 2 acima, mas adicione um cliente ao serviço friends_timeline.{format}].
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.
Clique em Refatorar. O IDE substitui todas as instâncias do nome de classe.
Na janela Navegador, localize a classe Twitter_Oauth_friends_timeline__format_JerseyClient. Em tal classe, localize e clique duas vezes no método getFriendsTimeline.
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);
}
Cole o método getFriendsTimeline na classe interna TwitterClient, abaixo do método getUserTimeline.
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:
Localize o construtor TwitterClient e remova o parâmetro String format.
É 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.
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";
Vá ao método getUserTimeline. Localize a linha return:
Localize e comente o método setResourcePath do TwitterClient. Ele nunca é chamado, mas recomenda-se fazê-lo como precaução.
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
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ê.
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.
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.
Para obter os nomes de usuário e os status do Twitter, o aplicativo chama a operação getFriendsTimeline do Twitter quando o aplicativo é executado. Para configurar, crie um novo método de execução que substitui o método run no main. Insira chamadas a getFriendsTimeline neste método.
Para que a exibição seja automaticamente atualizada, coloque o método de execução que contém a operação getFriendsTimeline em um java.util.TimerTask que executa o método run a cada 75 segundos.
O aplicativo 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 poderá formatar a exibição dos dados. Para isso, crie um novo JPanel que implementa o javax.swing.ListCellRenderer. Este JPanel retorna um objeto java.awt.Component com o nome de usuário e status passados no JLabels. Adapte o formato do JPanel.
No TwitterJFrame, defina o JList para exibir os objetos Componente retornados pelo JPanel.
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:
Abra o TwitterJFrame na visualização Código-fonte do editor.
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);
}
}
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);
}
}
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.
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() {
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:
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() {
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
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(){
@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:
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.
Nomeie o JPanel como Item e coloque-o no pacote twitterclient.
Clique em Terminar. O Item.java é aberto na visualização Desenho do editor.
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.
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.
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.
Abra a caixa de diálogo Propriedades do JTextPane e faça experiências com sua aparência.
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?
Encontre a declaração de classe e adicione o código implements ListCellRenderer.
public class Item extends javax.swing.JPanel implements ListCellRenderer {
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.
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;
}
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.
Retorne ao TwitterJFrame. Na visualização Desenho, selecione JList. Clique com o botão direito do mouse e abra suas Propriedades.
Selecione a propriedade modelo. Pressione Ctrl-Espaço. O editor de propriedade personalizada é aberto, mostrando o texto padrão exibido na lista.
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.
Na caixa de diálogo Propriedades, selecione cellRenderer e pressione Ctrl-Espaço. O editor de propriedade personalizada é aberto.
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.
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.
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:
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.
Na árvore Categorias, selecione Executar. As propriedades de execução são exibidas:
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!
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.
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 .