Twitter SaaS를 사용한 Swing 프로그램 만들기

0

Written on 오전 12:22 by 강여사(J.Y.Kang)

이번 게시물에는 Twitter를 사용한 GUI 프로그램을 만들어보도록 하겠습니다.
이 Twitter 시리즈는 나중에 JavaFX 기반의 모바일 프로젝트에도 가능합니다 ^^ Twitter 사용자의 많은 수가 iphone 유저라는 걸 보면 짐작이..^^
아무튼 Twitter를 비롯, 여러 오픈 SaaS가 있는데 이러한 식으로 사용하시면 됩니다.
넷빈에서 바로 연동되는 SaaS의 종류는 기본으로 Service 탭에 웹 서비스를 확장하시면 볼 수 있습니다.
프로젝트를 위해 http://twitter.com 에 회원가입을 하고 계정을 만들어두시기 바랍니다.

환경
넷빈즈 6.7.1
Twitter 계정 사용자이름/비밀번호

그럼 Twitter를 사용하는 GUI 클라이언트 프로그램 작업을 위해 새 프로젝트를 만듭니다.
File - new project

java - java application 다음

프로젝트 명: TwitterSwingClient
경로: 알아서
마침

GUI를 위해 프로젝트에서 마우스 오른쪽 클릭 - new - JFrame Form 선택

클래스명: TwitterJFrame
패키지명: twitter.ui
마침

디자인창에다 오른쪽 파레트로 부터 Label 과 TextField 그리고 버튼을 드래그하여 그림과 같이 배치합니다.
버튼에서 오른쪽 마우스를 클릭하면 Properties 메뉴가 보이는데 클릭하게되면 아래 그림과 같이 팝업창이 뜹니다.

text : Update 로 주고 엔터키를 치면 변경됩니다.


Label에서 다시 오른쪽 마우스를 클릭하여 Properties 를 클릭하면 등록정보에 대한 팝업창이 뜹니다. 여기서 text는 icon 으로, labelFor 에 옆의 드래그메뉴 중 jTextField1 를 선택합니다.
아래쪽으로 내려서 maximumSize , minimumSize, preferredSize 를 모두[48,48] 로 주고 requestFocusEnabled 체크를 해제합니다.
오른쪽에서 ScrollPane 를 선택해서 드래그해 놓습니다.
이 스크롤패인안에다 다시 List를 드래그해서 놓습니다
source 탭으로 변경하여 main 메소드 위에 공간을 띠우고 다음 메소드를 작성합니다.
========================================
private void initUserInfo() {


}
========================================
이번에는 Services 탭으로 가서 Web Services 를 확장하면(클릭) Twitter 가 나타납니다. 그럼 Twitter - What are you doing Service - statuses - user_timeline.{format} 안에 getUserTimeline를 선택하여 위 소스 부분의 빈 공간에 드래그합니다. 그럼 아래 그림과 같이 팝업창이 뜹니다.

여기에서 count 를 1로 format 를 xml 로 각각 입력한후 엔터키를 치면 변경됩니다.
OK

작성된 소스를 확인하면 다음과 같습니다.
==============================================
private void initUserInfo() {

try {
String since = null;
String sinceId = null;
String page = null;
String count = "1";
String format = "xml";

RestResponse result = TwitterWhatAreYouDoingService.getUserTimeline(since, sinceId, page, count, format);
if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
} else if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.NilClasses) {
twitter.whatareyoudoingservice.twitterresponse.NilClasses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class);
}
//TODO - Uncomment the print Statement below to print result.
//System.out.println("The SaasService returned: "+result.getDataAsString());
} catch (Exception ex) {
ex.printStackTrace();
}

}
==============================================
여기 if 부분을 다음과 같이 수정합니다. (굵은 글씨 참조)
================================================
if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses){
twitter.whatareyoudoingservice.twitterresponse.Statuses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
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);

}
================================================
편집기의 빈공간에 오른쪽마우스를 클릭하여 fix import (단축키 Ctrl+Shift+I)를 클릭하여 임포트를 추가합니다. (java.net.URL)
클래스 위쪽의 생성자 부분에서 본 메소드를 추가호출합니다.(굵은 글씨 참조)
================================================
public class TwitterJFrame extends javax.swing.JFrame {

/** Creates new form TwitterJFrame */
public TwitterJFrame() {
initComponents();
initUserInfo();
}
================================================
실행하기 전에 Twitter 계정에 대한 설정(인증)작업을 합니다.

프로젝트의 Source Packages 아래 org.netbeans.saas.twitter 안에 보면 twitterwharareyoudoingserviceauthenticator.properties 가 있습니다. open으로 열어보면 username 과 password 가 있는데 각자 twitter 계정의 username과 password 를 적으시면 됩니다. 그런 다음 프로젝트를 실행합니다. - Run
메인클래스 설정을 위한 팝업창이 뜹니다. OK
일단 정상적으로 Swing 이 불려지면 이제 보다 자세한 코드 추가 작업들을 하겠습니다.

버튼 클릭시 update 를 위해 버튼 디자인에서 더블클릭을 하면 소스탭으로 옮겨집니다. 그럼 여기에 다시 Twitter의 updateStatus 오퍼레이션을 불러옵니다.

Twitter-What Are You Doing Service - statuses - update.{format} - updateStatus 를 드래그합니다. 그럼 아래그림처럼 팝업창이 뜨고 OK 한 후 코드 수정작업을 합니다. 자동 생성된 코드에서 String status = ""; 부분은 다음과 같이 변경합니다.
String status = jTextField1.getText().trim();


GUI에서 사용자이름과 상태를 표시하기 위해 Timer 작업을 추가합니다.
TimerTask를 추가하는 방법은 다음과 같습니다.
생성자 부분에 다음과 같이 Timer를 추가합니다. (굵은 글씨 참조)
===============================================
public class TwitterJFrame extends javax.swing.JFrame {

/** Creates new form TwitterJFrame */
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false); initComponents();
initUserInfo();
}
===============================================
임포트를 위해 fix import를 합니다. (java.util.Timer)

그런 다음 다음 코드를 추가 삽입합니다
===================================
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();
}
===================================

getPublicTimeline 오퍼레이션과 함께 run 메소드를 추가합니다.
우선 리스트에 대한 모델 작업부터 합니다.
클래스 선언 아래 다음 코드를 추가합니다. (굵은 글씨 참조)
====================================
public class TwitterJFrame extends javax.swing.JFrame {

private DefaultListModel statuses = new DefaultListModel();


/** Creates new form TwitterJFrame */
public TwitterJFrame() {

====================================
TimerTask 객체안에 새 run() 메소드를 오버라이드 합니다. (굵은 글씨 참조)
====================================
/** 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();
}
====================================

그런 다음 이 부분에 getPublicTimeline 오퍼레이션을 추가합니다.

Twitter - What Are You Doing Service - statuses - [public_timeline.{format} - getPublicTimeline 드래그

팝업창에 xml 을 입력하고 엔터키로 변경한 후 OK

생성된 소스 확인==================================
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false);
t.scheduleAtFixedRate(new TimerTask() {

@Override
public void run() {

try {
String format2 = "xml";

RestResponse result2 = TwitterWhatAreYouDoingService.getPublicTimeline(format2);
if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
} else if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.NilClasses) {
twitter.whatareyoudoingservice.twitterresponse.NilClasses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class);
}
//TODO - Uncomment the print Statement below to print result.
//System.out.println("The SaasService returned: "+result2.getDataAsString());
} catch (Exception ex) {
ex.printStackTrace();
}

}

}, 1500, 75000);
initComponents();
initUserInfo();
}
==================================
if 부분에 다음 코드 추가 (굵은 글씨 참조)
==================================
if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
for (final StatusType st : result2Obj.getStatus()) {
SwingUtilities.invokeLater(new Runnable() {

public void run() {
statuses.addElement(st);
}
});
}
}
==================================
리스트 셀 렌더링을 위한 컴포넌트를 만들겠습니다.

프로젝트에서 오른쪽 마우스 클릭 - new - JPanel Form

클래스 이름: Item
패키지 이름: twitter.ui
마침

Label을 드래그해서 username 이라고 적어줍니다.

그리고 그 아래 Text Pane 를 드래그해서 놓습니다. Text Pane 의 text 는 status text 라고 입력후 엔터키로 반영(그림 오른쪽 아래)

username 의 label에서 오른쪽 마우스를 클릭하면 프로퍼티(등록정보)메뉴가 있습니다. 클릭
labelFor 에 jTextPane1를 선택하고

foreground 에는 파란색 [0,51,255] RGB 값을 입력합니다.

source 탭을 클릭하여 클래스 선언에 리스트셀렌더러 인터페이스를 붙입니다.

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



임포트를 수정합니다. fix import (Ctrl+Shift+I) javax.swing.ListCellRenderer

그런 다음 다음 메소드를 추가합니다.
======================================================
public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) {
StatusType st = (StatusType) value;
jTextPane1.setText(st.getText());
jLabel1.setText("" + st.getUser().getScreenName() + "");
return this;
}
======================================================

다시 fix import
이제 list 부분을 편집하도록 하겠습니다. 디자인창에서 list를 클릭하여 오른쪽 마우스 클릭 - 등록정보

팝업창이 뜨면 model 이 있습니다. 여기서 오른쪽의 ... 을 클릭합니다.

그럼 list 설정 팝업창이 뜹니다. 여기에서 위의 드래그 메뉴를 Custom code 로 선택합니다.


그럼 아래 설정부분이 제시되는데 거기에 statuses 라고 입력합니다. (그림 참조)
OK

이번에는 cellRenderer 에서 ... 을 클릭하면 등록정보 창이 뜹니다.
역시 custom code 로 바꾼 후 빈칸에 new Item() 이라고 적습니다
OK

이상이 프로젝트 작업 끝입니다.

실행하면 (run) 아래 그림 처럼 twitter 가 제시됩니다.

참고로 아래 아이콘은 twitter에 등록된 제 아이디의 아이콘이 나타납니다. (넷빈로고라는..ㅋㅋ)

수고하셨습니다. *^^*

If you enjoyed this post Subscribe to our feed


No Comment

댓글 쓰기