Criando um cliente para Twitter – Parte 2
Foi mal a demora pessoal, o tempo tah foda aqui…
Se você caiu de paraquedas nesse post eu sugiro a leitura do post anterior: Criando um cliente para Twitter – Parte 1.
Segunda parte do nosso tutorialzinho!
Agora iremos criar:
- Um formulário para realizar o login (sem utilizar o OAuth)
- Um formulário para:
- mostrar os ultimos tweets da timeline
- possibilitar o envio de um tweet
Vamos lá então, crie um novo projeto no NetBeans e adicione o twitter4j nas bibliotecas.
Adicione um JFrame e deixe parecido com este:
O campo para usuário é um JTextField com o nome jTF_Nome.
O campo para a senha é um JPasswordField com o nome jPF_Senha.
O JButton não tem nada de mais, só coloquei o passarinho ai pra ficar mais bonitinho. ^^
O JPasswordField é mais do que um JTextField que mascara as letras, existem todo um esquema de segurança por trás deste componente. Tanto que a recuperação do que foi digitado é um pouco mais chatinha: ao invés de uma String, é recuperado um objeto do tipo char[]. Como o login é exige duas strings (usuário e senha) como parâmetro, fiz um método para realizar a conversão.
Vamos ao código do botão responsável pelo login:
public String pegaSenha() { char[] senha = jPF_Senha.getPassword(); String str = ""; for (int i = 0; i < senha.length; i++) { str += senha[i]; } return str; } public void EfetuarLogin() { String usu = jTF_Usuario.getText(); String senha = pegaSenha(); try { Twitter t = new TwitterFactory().getInstance(usu, senha); User u = t.verifyCredentials(); Principal p = new Principal(t,u); p.setLocationRelativeTo(null); p.setVisible(true); this.dispose(); } catch (TwitterException e) { if (e.getStatusCode() == 401) { JOptionPane.showMessageDialog(this, "Usuário e/ou senha inválidos!"); } } }
Nada muito novo em relação ao post anterior. É criado um novo objeto Twitter com os dados que foram digitados. Para garantir que os dados estão corretos existe o método verifyCredentials() que em caso de sucesso retorna um objeto User que referencia o usuário que acabou de se logar. Se estiver tudo certo então chama o próximo JFrame (Principal) e retira o formulário de login da memória (uma vez que ele não será mais usado).
Em caso de falha, é jogada uma exceção do tipo TwitterException. Se o status code da exceção for 401 significa que o usuário e/ou senha estão errados, daí é só avisar o usuário.
O próximo formulário é um pouco mais complexo… Adicione um novo JFrame ao projeto e chame de Principal.java. Deixe ele parecido como este:
Segue a lista dos componentes:
JLabel jL_Foto –> tamanho 48×48
JTextArea jTA_Status –> pra digitar a mensagem
JLabel jL_Restantes –> vai indicar quantos caracteres ainda restam
JScrollPane jScrollPane2 –> a borda foi mudada para ficar mais legal como esta na figura (Ultimos Tweets)
JPanel jP_Tweets –> este panel vai receber os ultimos tweets, ele fica dentro do jScrollPane2. O layout desse panel é do tipo BoxLayout (layout de caixa) com a propriedade eixo setada em Y.
Vamos lá então! Exibindo os últimos tweets:
public class Principal extends javax.swing.JFrame { private Twitter t; private User eu; Image foto; /** Creates new form Principal */ public Principal(Twitter t, User eu) { this.t = t; this.eu = eu; initComponents(); recuperarDados(); } private void recuperarDados() { this.foto = this.getToolkit().getImage(eu.getProfileImageURL()); jL_Foto.setIcon(new ImageIcon(foto)); carregaTimeline(); } public void carregaTimeline() { try { JPanel pane; JLabel novaFoto; JTextArea msg; int i = 0; jP_Tweets.removeAll(); for (Status s : t.getFriendsTimeline()) { i++; //cria o panel pane = new JPanel(new FlowLayout(FlowLayout.LEFT)); pane.setBorder(new LineBorder(Color.black, 1)); pane.setSize(370, 50); //cria o label com a foto novaFoto = new JLabel(new ImageIcon(this.getToolkit().getImage(s.getUser().getProfileImageURL()))); //cria o textarea com o texto msg = new JTextArea(3, 27); msg.setEditable(false); msg.setText(s.getText()); msg.setLineWrap(true); pane.add(novaFoto); pane.add(msg); jP_Tweets.add(pane); } } catch (TwitterException ex) { JOptionPane.showMessageDialog(this, "Erro recuperando a timeline: " + ex.getMessage()); } } ... }
A classe possui 3 atributos que eu considero completamente autoexplicativos mas vamos dar uma pequena passada por eles:
- Twitter t –> velho conhecido nosso não é…
- User eu –> para guardar as informações de quem está logado
- Image foto –> para guardar a imagem de perfil do usuário
Logo quando o formulário é criado, o método recuperarDados() é chamado, a foto do usuário é carregada e então o método carregaTimeline() é invocado.
O carregaTimeline() cria dinamicamente a lista com os ultimos tweets. O código está todo comentado e está bem fácil de entender.
Vale ressaltar que para a lista ficar certinha (um tweet por linha) o layout do panel jP_Tweets deve ser BoxLayout!
Vamos para a próxima parte então: Atualizando o status.
Mude a propriedade lineWrap do jTA_Status para true, com isso a linha não vai ultrapassar os limites do text area e o texto vai ficar dentro dela.
Para fazer a contagem dos caracteres restantes vamos utilizar de uma funcionalidade bem interessante do text area: O evento caretUpdate é chamado toda vez que uma tecla é adiciona ou deletada, sendo assim, adicione o seguinte código neste evento caretUpdate do jTA_Status:
private void jTA_StatusCaretUpdate(javax.swing.event.CaretEvent evt) { jL_Restantes.setText(String.valueOf(140 - jTA_Status.getText().length())); }
Próximos passos: não deixar o usuário digitar mais do que 140 caracteres e postar a mensagem.
O que vamos fazer é o seguinte: se o usuário for digitar o 141º a gente simplesmente cancela ele. Podemos tratar as duas funções no evento keyTyped do jTA_Status.
Segue o código:
private void jTA_StatusKeyTyped(java.awt.event.KeyEvent evt) { if (jTA_Status.getText().length() == 140) { evt.setKeyChar((char) KeyEvent.VK_CLEAR); } if (evt.getKeyChar() == KeyEvent.VK_ENTER) { try { t.updateStatus(jTA_Status.getText()); jTA_Status.setText(""); carregaTimeline(); } catch (TwitterException ex) { JOptionPane.showMessageDialog(this, "Erro atualizando o status: " + ex.getMessage()); } } }
Muito tranquilo. Pouco código e muitas funcionalidades.
Agora nosso cliente já está com uma cara bem legal. Eu implementei mais algumas frescurinhas e ele ficou assim:
Ali embaixo da minha foto tem um label que mostra um pedacinho do ultimo post… embaixo da lista mostra quantos tweets foram carregados… enfim, um monte de frescura que eu nem mostrei aqui…
Quem quiser conferir o projeto completo pode pegar aqui.
Sugestões para quem quiser aperfeiçoar um pouco mais esse humilde cliente de Twitter:
- De 5 em 5 minutos recarregar a lista de tweets. Dica: utilizando Threads fica facinho.
- Ao clicar na foto da pessoa, uma janela abre com as informações da pessoa.
- Adicionar um botão para retwittar a mensagem.
Quem quiser tem como brincar bastante com isso ai…
Valew pessoal,
[]s e até a próxima.
Saab.
Popularity: 4% [?]






Oi, tudo bem? Achei seu site pelo google pesquisando sobre API. Não sei se poderá me ajudar…eu tenho um Samsung JET e tento usar twitter por programa pelo celular e consegui baixar alguns programas, mas, qndo conecto e tento fazer qq coisa ele diz que precisa do API e desliga o programa. Vc tem alguma idéia do que possa ser e como consigo essa informação?
obrigada
Mitia,
Pergunta dificil em…
Supondo que estes programas sejam feitos em Java, vc coloca só o .jar no celular não é… Ai já complico pq vc (geralmente) não tem o código fonte no .jar e fica dificil saber qual API ele utiliza e como colocar a API no lugar certo…
Procurei rapidinho na Internet e achei algo que possa te ajudar nesse site: http://www.kakoholder.com/2009/11/samsung-jet-ganha-atualizacao-de-firmware/
Uma atualização de firmware para o Jet que adiciona a funcionalidade do Twitter, Facebook e MySpace. Dê uma boa lida e tenha certeza que seu celular pode ser atualizado.
Boa sorte!
Ola…
Podes dizer como farias os threads para actualizar a pagina de 5 em 5 segundo ou 10 em 10….
Obrigada
Você pode tentar assim:
Depois que o usuário conseguir se logar, dê start em uma nova Thread que será responsável por isso.
Você pode criar uma nova classe que herde da classe Thread, ou vc pode criar uma nova classe que implemente a interface Runnable (dos dois jeitos vc consegue criar uma nova thread).
Segue um possível exemplo:
//…..
Thread atualizacao = new Thread(){
public void run() {
try {
//recupera os novos tweets
//atualiza a lista
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
};
atualizacao.start();
//……..
Com isso vc vai ter uma thread rodando até a tua aplicação ser finalizada…
[]s
Que Maravilha de Posts Felipe ^^
meus parabéns! mto legal mesmo!
vou baixar esse projeto seu e estudar, gostei mto!
ae já ta no meu blog roll (na próxima atualização no meu blog) ^^
abraços!! t+
ps. tinha algumas coisas complexas para o meu nível, mas ficou bem explicado ^^
show().
[]’s
Valew Thiago,
Boa sorte com os estudos ae, qualquer duvida é só dar um toque.
[]s