Web Servisleri: Netbeans Kullanarak Twitter İstemcisi Yapma

Netbeans’in sitesindeki web service tutorials sayfasında [0], Software as a Service (SaaS) kategorisinde bulunan Creating a Graphical Client for Twitter [1] isimli dökümanda anlatılanları yapmaya çalıştım ve görüntüsü ile işlevi ordakine benzer bir şey ortaya çıktı.
Bu yazımda, bu iş için uğraşırken neler yaptığımdan bahsedeceğim (anladığım kadarıyla).
Olası yanlış eylem ve anlatımlar için baştan uyarımı yapayım.

Başlamadan önce eğer bir twitter hesabınız yoksa twitter.com’a gidip bir hesap edinin.
Sayfada dediğine göre twitter hesabının yanında Netbeans 6.5, 6.7 ya da 6.8 sürümlerinden biri ile Java Development Kit (JDK) V6 ya da V5’e de ihtiyacımız olacak. Ayrıca “web servisi ne demek?” diyenler olursa bu yazıdan önce wiki’den [2] web servisine baksa hoş olur.

Arayüzün tasarlanması

Tasarlanacak ekranda genel twitlerin akışının olacağı bir liste, kişinin kullanıcı resmi ve durumunu okuyup istediğinde güncellemesi için bir metin kutusuyla bir buton olacak. Şimdi projeyi oluşturalım.

Bunun için; Netbeans’i açıp, File -> New Project -> Java -> Java Application yolunu izleyelim.

Daha sonra projemize bir isim verelim ve Create Main Class seçeneğinin başındaki tick’i kaldıralım. Ben ismi TwitterClient olarak vermişim.
Buraya kadar herhangi bir problem olmadıysa şu aşağıdakine benzer bir görüntü ortaya çıkmış olmalı.

IDE yeni bir proje oluşturacaktır. Şimdi projeye bir paket ekleyelim ve o pakete de bir JFrame Form ekleyelim.
Bunun için paket üzerine sağ tıkladıktan sonra New -> JFrame Form ya da New -> Other -> Swing GUI Forms -> JFrame Form yolu izlenir.
Bu da yapıldıysa karşımızda aşağıdakine benzer bir ekran olmalı.

Finish butonundan sonra IDE yaratılan formu tasarım kipinde açacaktır. Sağ taraftaki palet kısmında da sürükle bırak ile kullanılabilecek tüm Swing bileşenleri bulunmaktadır. Şimdi o paletten bir buton (jButton1) süreükleyip formun üzerine bırakalım. Daha sonra botun özelliklerinden ismi ve iconu değiştirilebilir. Bu buton, metin kutusuna yazdıklarımızı kullanarak durumumuzu güncellemek için kullanacağımız buton.
Butondan sonra bir tane de metin kutusuna ihtiyacımız var. Bunun için de paletten bir tane Text Field (jTextField1) sürükleyip butonun yanına bırakalım.
Buton ve metin kutusundan sonra da kullanıcı resmi için bir tane Label (jLabel1) sürükleyip metin kutusunun yanına bırakıyoruz. Üzerinde sağ tıkladıktan sonra Maximum Size, Minimum Size ve Preferred Size özelliklerini [48, 48] olacak şekilde değiştiriyoruz. Çünkü görünen resim boyutları bu kadar olacak, daha büyük olması sadece gereksiz boşluklara yol açacaktır.

Şimdi de twitlerin listesi için bir adet Scroll Pane ve içine de bir adet List sürükleyip bırakıyoruz. Daha sonra da formu kaydediyoruz.
Tasarımda kullanılacak elemanlar bu kadar. Eğer herhangi bir problem olmadıysa görüntü şuna benzer olacaktır:

Kullanıcı Durumunu Gösterme

Arayüz tasarımından sonra kod kısımlarına başlayabiliriz. Kullanıcı durumunun gösterilmesi için yapılması gerekenleri bu başlık altında yazalım.
TwitterJFrame.java dosyasını açıp, tasarım kısmından kod kısmına geçelim ve main () metodunun yerini bulup üzerinde birkaç satır boşluk bırakalım.
Burda da aşağıdaki gibi yeni bir metod tanımlayalım ;

        private void initUserInfo() {
            
        }
    

Şimdi IDE’nin Services penceresini açalım. Web Services altında Twitter > What Are You Doing Service > [statuses] > [user_timeline.{format}] > getUserTimeline yolunu izleyelim. Orda bulunan getUserTimeline parçasını yukarda oluşturduğumuz initUserInfo() metodunun içine sürükleyip bırakalım. Karşımızda Customize GET SaaS Service penceresi açılacaktır. O pencerede bulunan count alanının default değerini 1 yapıp diğer default değerleri değiştirmeden devam edelim.

IDE bizim için initUserInfo() metodunun içinde kod üretecektir. Ayrıca org.netbeans.saas ve org.netbeans.saas.twitter paketleri ile içlerinde bazı dosyalar oluşturacaktır. Eğer kod düzensiz görünüyorsa editör içinde sağ tık -> format ya da Alt + Shift + F ile otomatik düzenleme yapılabilir.
Durumdan rahatsız olmayanlar için buna da gerek yok tabi ki :) Oluşturulan bu koddaki if () bloğunun içine aşağıdaki kodu eklemeliyiz :

       StatusType st = resultObj.getStatus().get(0);
       jTextField1.setText(st.getText().trim());
       UserType user = st.getUser();
       String iconSrc = user.getProfileImageUrl();
       URL iconUrl = new URL(iconSrc);
       ImageIcon icon = new ImageIcon(iconUrl, user.getScreenName());
       jLabel1.setIcon(icon);
    

Eklediğimiz bu kod kullanıcı resmimiz ile mevcut durumumuzu jLabel1 ve jTextField1 içinde görüntülememizi sağlamak içindi. Tabi çalışması için IDE’nin yönlendirdiği gerekli importlar yapılmalı. Bunun için Ctrl + Shift + i kısayolu da kullanılabilir. Gerekli importlar da yapıldıktan sonra constructor bulunup içine initUserInfo(); satırı da eklenmelidir.

        public class TwitterJFrame extends javax.swing.JFrame {

            /** Creates new form TwitterJFrame */
             public TwitterJFrame() {
                     initComponents();
                      initUserInfo();
             }
    

Projeyi kaydedip çalıştırdığımızda aşağıdakine benzer bir şeyler ortaya çıkmalı. Bu arada 16 Mayıs 2010’da hayata gözlerini yuman müzisyen Ronnie James DIO’nun da ismi bu yazıda yer almış oldu..

Bu sıra ile gidilirse proje istediğimiz gibi çalışmayacaktır çünkü herhangi bir yere kullanıcı adı ve parola girmedik. Bu bilgileri yazacağımız yer ise org.netbeans.saas.twitter içindeki twitterwhatareyoudoingserviceauthenticator.properties dosyası.

Netbeans sayfasına Windows XP ve Linux için login işlemlerinde problemler çıkacağı yazıyordu.
Ben Pardus 2009.1 kullanıyorum ve bende de bahsettiği problemler çıktı. Çözümü de aynı sayfada verilmiş. Çözümü için örnek projede [3] bulunan twitterclient.AuthDialog.java dosyasını kendi twitterclient paketimize kopyalamamızı ve org.netbeans.saas.twitter altındaki TwitterWhatAreYouDoingServiceAuthenticator.java dosyasını kendimizinkinin yerine koymamızı öneriyordu. Önerdikleri değişiklikleri yaptım ve proje sorunsuz çalıştı.

Durum Güncelleme Metodunun Eklenmesi

Güncelleme butonumuzun metin kutusundan aldığı metni kullanarak durumumuzu güncellemesini sağlamak için butona çift tıklayalım. IDE bizim için jButton1ActionPerformed () metodunu oluşturacaktır. Şimdi yeniden Services penceresinden Web Services -> Twitter -> WhatAreYouDoingService -> Statuses -> [update.{format}] -> updateStatus yolunu izleyelim. Daha sonra da burada bulunan updateStatus metodunu sürükleyip jButton1ActionPerformed() metodunun gövdesine bırakalım. Çıkan penceredeki öntanımlı değerleri kabul edip devam edelim.

Oluşturulan kod içindeki try bloğundaki

        String status = "";
    

satırını

        String status = jTextField1.getText().trim();
    

satırı ile değiştirdikten sonra projeyi kaydedip çalıştıralım. Formumuz artık durum güncellemesi yapabilmektedir.

Kullanıcı İsimlerini ve Durumlarını Formda Gösterme

Twitlerin otomatik görünmesi için bir Timer nesnesine ihtiyacımız olacak. Bunun için consructordaki initComponents(); satırının üzerine Timer nesnesi için bir satır daha eklenir.

    public class TwitterJFrame extends javax.swing.JFrame {
        
    /** Creates new form TwitterJFrame */
    public TwitterJFrame() {
    Timer t = new Timer("Twitter Updater`", false);
    initComponents();
    initUserInfo();
    }
    

Gerekli importlar yapıldıktan sonra consructor şöyle olacaktır :

    public class TwitterJFrame extends javax.swing.JFrame {

    /** Creates new form TwitterJFrame */
    public TwitterJFrame() {
        Timer t = new Timer("Twitter Updater`", false);
        t.scheduleAtFixedRate(new TimerTask() {

        }, 1500, 75000);
        initComponents();
        initUserInfo();
                    }
     

Sonra da consructordan önce

        private DefaultListModel statuses = new DefaultListModel();
    

satırlarnı koda eklemeliyiz. Gerekli importlar ve eklenen otomatik kodlardan sonra elimizde şu kodlar yer almalı :

        public class TwitterJFrame extends javax.swing.JFrame {

    private DefaultListModel statuses = new DefaultListModel();

    /** Creates new form TwitterJFrame */
    public TwitterJFrame() {
        Timer t = new Timer("Twitter Updater`", false);
        t.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run(){

            }
        }, 1500, 75000);
        initComponents();
        initUserInfo();
                    }
    

Şimdi yeniden Services penceresine açalım ve Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [public_timeline.{format}] -> getPublicTimeline yolunu izleyelim. getPublicTimeline metodunu t.scheduleAtFixedRate içindeki run() metodunun gövdesine sürükleyip bırakalım. Açılan pencerede yine default değerleri kabul edip devam edelim. IDE’nin bizim için oluşturduğu kod içindeki if() bloğunun içine(en alta), şu aşağıdaki kodu ekleyelim:

        for (final StatusType st : result2Obj.getStatus()) {
          SwingUtilities.invokeLater(new Runnable() {

              public void run() {
                   statuses.addElement(st);
              }
          });
     }
    

Gerekli kütüphaneler import edildikten sonra genel akıştaki twitlerin alınması işi tamamlanmış oluyor. Şimdi bu twitleri listeleyebilmek için bir
nesne oluşturalım.

Bunun için en başta oluşturduğumuz twitterclient paketinde sağ tıkladıktan sonra New > JPanel Form yoluyla bir JPanel Form ekleyelim. Açılan sayfada JPanel’e Item ismini verelim ve kaydedelim.

Açılan tasarım ekranında paletten bir Label ve Text Pane sürükleyip formun üzerine bırakalım. Label kullanıcı ismini, Text Pane de o kullanıcının twitini gösterecek. Daha sonra tasarım kısmından çıkıp kod kısmına geçildiğinde:

        public class Item extends javax.swing.JPanel {
    

satırına implements ListCellRenderer ifadesi eklenir.

        public class Item extends javax.swing.JPanel implements ListCellRenderer {
    

Bu işlemden sonra aşağıdaki bloğa da yeni satırlar ekleyerek o hale getirelim ve gerekli kütüphaneleri import edelim:

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

Artık Item classımız da hazır. Şimdi jFrame’e geri dönelim ve tasarım kipinde açalım. JList üzerinde sağ tıklayıp Properties penceresini açalım.

model özelliğini seçelim ve Ctrl + Space tuşlarına birlikte bastığımızda yeni bir pencere açılacak.

“Set jLlist1’s model property using:” menüsünden Custom Code seçeneğini seçelim ve açılan metin kutusuna “statuses” yazalım ve devam edelim.

Properties penceresindeki cellRenderer özelliğini seçelim ve yine Ctrl + Space tuşlarına birlikte basalım. Açılan pencerede karşımıza çıkan “Set jList1’s cellRenderer property using:” menüsünden Custom Code seçeneğini seçtikten sonra metin kutusune new Item() yazıp devam edelim.

İşte bu kadar!

Projeyi kaydedip çalıştırdığımızda Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [public_timeline.{format}] -> getPublicTimeline kullandığımız için takip etmediğimiz kişilerin de twitlerini görüntülüyor olacağız. Daha edepli şeyler görmeyi umardım :)

Peki sadece takip ettiğimiz kişilerin twitlerini görüntülemek için ne yapmalıyız? Çok fazla bir değişiklik yok aslında. Yukarıda
Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [public_timeline.{format}] -> getPublicTimeline yolunu izlemiştik.
Şimdi sadece o yolu Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [friends_timeline.{format}] -> getFriendsTimeline yoluyla değiştireceğiz. O değişiklikten sonra da aşağıdaki gibi bir ekran elde ettim.

Takip ettiklerim inşallah telif hakkı diye koşmazlar gelecekte arkamdan :)

Bir hazır çalışmanın daha sonuna geldik. İleride belki bir şeyler öğrenirim de kendi çalışmalarımı burda yazarım. Şimdilik umuduyla yaşayıp sıfır uğraşla devam edelim..


[0] -> http://netbeans.org/kb/trails/web.html
[1] -> http://netbeans.org/kb/docs/websvc/twitter-swing.html
[2] -> http://en.wikipedia.org/wiki/Web_service
[3] -> http://www.oguzozkeroglu.com/download/TwitterSwingClient.zip
     -> http://netbeans.org/files/documents/4/2432/TwitterSwingClient.zip

İlgili olabilecek yazılar:

Java %100 Nesne Yönelimli Bir Programlama Dili Midir?
Java :: Jersey ile RESTful Webservislere Eclipse, Maven ve Apache Tomcat Kullanarak Giriş Yapalım
EcaHack Hackathon @ Android Developer Days 2013 Ardından
Android :: JSON Parse İşlemleri – 2
Android :: JSON Parse İşlemleri – 1


Web Servisleri: Netbeans Kullanarak Twitter İstemcisi Yapma” yazısına 6 yorum yapılmış.

  1. merhaba bu uygulamayı adım adım yaptım arkadaşım olmayan kişilerin twetlerini göstermeye kadar yapıyorum ancak kendi arkadaşlarımınkini yapmayı yapamadım bir türlü acaba orada başka bir şey mi ekliyoruz ya da onu eklerken başka bir şey mi yazıyoruz

  2. @ahmet
    Yazıyı yazmamın üzerinden 2 yıldan fazla zaman geçmiş, tüm adımları tam olarak hatırlamıyorum ama yazıda şöyle bir kısım var:

    “Peki sadece takip ettiğimiz kişilerin twitlerini görüntülemek için ne yapmalıyız? Çok fazla bir değişiklik yok aslında. Yukarıda
    Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [public_timeline.{format}] -> getPublicTimeline yolunu izlemiştik.
    Şimdi sadece o yolu Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [friends_timeline.{format}] -> getFriendsTimeline yoluyla değiştireceğiz.”

    Yeni bir proje oluşturup bu yolu izlersen ya da yaptıklarını bu şekilde güncellersen çalışacağını düşünüyorum.

Bir Cevap Yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.