SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Java、Swing、Twitter4jを使ってあなただけのTwitterアプリを作成しよう

ステータスの更新、フォロワーのリストの取得などを簡単に実装

  • X ポスト
  • このエントリーをはてなブックマークに追加

つぶやきを検索する

 このアプリケーションを構成する3つの要素の残り1つを作成します。つぶやきの検索、ダイレクトメッセージの送信、最新トレンドの表示といった機能をパネルに作成します。このパネルを以降は「右側のバー」と呼ぶことにします。

import twitter4j.*;
import javax.swing.*;
import java.awt.*;

public class RightSideBar extends JPanel{
    int componentsWidth = 180;
    int panelHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();

    public RightSideBar(Twitter twitter) throws TwitterException {
        super(new FlowLayout());
        this.setSize(componentsWidth, panelHeight);
        this.setPreferredSize(new Dimension(componentsWidth, panelHeight));
        this.setMaximumSize(new Dimension(componentsWidth, panelHeight));

        this.add(new SearchTweetsPanel(twitter));
        this.add(new DirectMessagePanel(twitter));
        this.add(new TrendsPanel(twitter));
    }
}

 このリストのコードでは、RightSideBarクラスをセットアップしています。このクラスは、JPanelを継承し、フローレイアウトを使用します。また、SearchTweetsPanelDirectMessagePanel、およびTrendsPanelの各インスタンスが含まれます。SearchTweetsPanelのクラス定義はこのようになります。

import twitter4j.*;
  
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class SearchTweetsPanel extends JPanel {
    Twitter twitter;
    JButton searchTweetsButton;
    JTextField searchTweetsTextField;
    int componentsWidth = 180;
    int panelHeight = 50;

    public SearchTweetsPanel(final Twitter twitter) {
        super(new FlowLayout());
        this.twitter = twitter;

        this.setSize(componentsWidth, panelHeight);
        this.setPreferredSize(new Dimension(componentsWidth, panelHeight));
        this.setMaximumSize(new Dimension(componentsWidth, panelHeight));

        searchTweetsButton = new JButton("Search Tweets");
        searchTweetsButton.setSize(new Dimension(componentsWidth, 20));
        searchTweetsButton.setPreferredSize(new Dimension(componentsWidth, 20));
        searchTweetsTextField = new JTextField();
        searchTweetsTextField.setSize(componentsWidth, 20);
        searchTweetsTextField.setPreferredSize(new Dimension(componentsWidth, 20));
        searchTweetsTextField.setMinimumSize(new Dimension(componentsWidth, 20));
        searchTweetsButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                QueryResult q = null;
                java.util.List<Tweet> tweets = null;

                try {
                    q = twitter.search(new Query(searchTweetsTextField.getText()));
                    tweets = q.getTweets();
                    String[] tweetArr = new String[tweets.size()];

                    for (int i = 0; i < tweets.size(); i++) {
                        tweetArr[i] = tweets.get(i).getFromUser() + "-" + tweets.get(i).getText();
                    }

                    // ダイアログボックスを開いて結果を表示
                    JFrame resultDialog = new JFrame();
                    JList list = new JList(tweetArr);
                    JScrollPane scrollPane = new JScrollPane(list,
                            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, // 垂直バー
                            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                    resultDialog.add(scrollPane);

                    resultDialog.setSize(new Dimension(1100, 320));
                    resultDialog.setPreferredSize(new Dimension(1100, 320));
                    resultDialog.setLocationRelativeTo(null);
                    resultDialog.setVisible(true);
                } catch (TwitterException e1) {
                    e1.printStackTrace();
                    JOptionPane.showMessageDialog(null, "Error occurred during search, try again.");
                }
            }
        });
        this.add(searchTweetsButton);
        this.add(searchTweetsTextField);
    }
}

 このクラスには、JButton(searchTweetsButton)、JTextField、およびJOptionPaneが含まれます。JTextFieldはコンストラクタで定義されたダイアログウィンドウであり、JOptionPaneはつぶやきの検索が正しく実行できなかった場合にエラーを表示するために使用します。コードを簡潔にするため、searchTweetsButtonaddActionListenerメソッド内に匿名の内部クラスを定義しました。この部分でつぶやきのマジックがすべて処理されます。twitter.search()メソッドは、twitter4j.Queryオブジェクトを受け取ります。このオブジェクトには文字列を格納します。この文字列が、つぶやき内で検索するテキストということになります。たとえば、このように使用します。

Query q = new Query(terminator);

 このコードでは、つぶやきの検索に使うQueryオブジェクトを作成し、そこに文字列terminatorを格納します。実用的な検索機能を提供するために、上記のコードリストではtwitter.search(new Query(my query string))としてメソッドを呼び出しています。サンプルアプリケーションでは、検索文字列をJTextField、つまりsearchTweetsTextFieldから取得するためにgetText()メソッドを呼び出します。

 検索の呼び出しからはQueryResultオブジェクトが返されます。つぶやきの文字列を実際に取得するには、もう少し手間がかかります。まず、Tweet型を収めるjava.util.Listコレクションが必要です。このリストに値を埋め込むために、QueryResultオブジェクトのgetTweets()メソッドを呼び出します。ここまではまだ簡単です。次に、つぶやきの文字列を収める場所になる、文字列配列tweetArrを作成します。つぶやきのリストに対して反復処理を行い、ユーザー名とそのつぶやきをtweetArrに挿入していきます。検索結果は、JFrame型のresultDialogに表示します。

図5 検索結果ダイアログ
図5 検索結果ダイアログ

 何かの異常やネットワーク接続エラーが起きたり、検索文字列を空で送信したりすると、例外がスローされます。そういった場合は、以下のエラーをポップアップ表示します。

図6 エラーのポップアップ
図6 エラーのポップアップ

次のページ
ダイレクトメッセージを送信する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Cesar Otero(Cesar Otero)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4409 2009/10/07 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング