• Mundo Java
  • Java Simples
    Porque Java não precisa ser dificil…
    • Home
    • Participe
    • Sobre Mim…
    RSS
    domingo, fevereiro 28, 2010 Categorized under Mundo Java

    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:

    image

    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:

    image

    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. :D

    Agora nosso cliente já está com uma cara bem legal. Eu implementei mais algumas frescurinhas e ele ficou assim:

    image

    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% [?]

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  

    6 Responses to “Criando um cliente para Twitter – Parte 2”

    1. Mitia disse:
      03/05/2010 às 20:55

      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

    2. Saab disse:
      03/05/2010 às 22:04

      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!

    3. Viris disse:
      24/06/2010 às 13:42

      Ola…
      Podes dizer como farias os threads para actualizar a pagina de 5 em 5 segundo ou 10 em 10….
      Obrigada

    4. Saab disse:
      24/06/2010 às 20:23

      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

    5. Thiago Marinho disse:
      12/08/2010 às 22:00

      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

    6. Saab disse:
      13/08/2010 às 10:43

      Valew Thiago,
      Boa sorte com os estudos ae, qualquer duvida é só dar um toque.

      []s

    Leave a Reply

    Clique aqui para cancelar a resposta.

    « Criando um cliente para Twitter – Parte 1
    Robot ? O Que é isso? »
    • Busca

    • Tags

      acessar annotations automacao blog bytes cliente computacional converter data date erro exemplo firebird formatacao framework idiomas integrar internacionalizacao ireport java jcalendar jdatechooser linguas manutencao mascara mysql netbeans objeto paleta pratico reflexao reforma representacao robot salvar serializacao simples spring string subreports transformando transformar tutorial twitter twitter4j
    • Posts mais acessados

      1. 100% Criando um cliente para Twitter - Parte 1
      2. 4% Criando um cliente para Twitter – Parte 2
      3. 3% Mudando a cor, fonte, alinhamento, etc... de células de JTable
      4. 3% Adicionando JCalendar e JDateChooser à paleta do Netbeans
      5. 3% Trabalhando com Datas… chega de trauma!
    • Links

      Web Development & Design Blogs TopOfBlogs Central Blogs BlogBlogs blog directory Web Development (Programming) - TOP.ORG Parceria.info - Divulgue seu Site Technology Blogs - Blog Rankings
    • Categories

      • Mundo Java
    • Blogroll

      • Twitter João Lucas
      • Twitter Keep Sistemas
      • Twitter Saab

    Copyright © 2010 Java Simples - Porque Java não precisa ser dificil…. Subscribe to our RSS.
    This web site is proudly powered by WordPress and a free wordpress theme by TopWPThemes.com.
    For the latest trends in web hosting and blogging software come to WebHostingFan.com.