つぶやきを検索する
このアプリケーションを構成する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を継承し、フローレイアウトを使用します。また、SearchTweetsPanel、DirectMessagePanel、および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はつぶやきの検索が正しく実行できなかった場合にエラーを表示するために使用します。コードを簡潔にするため、searchTweetsButtonのaddActionListenerメソッド内に匿名の内部クラスを定義しました。この部分でつぶやきのマジックがすべて処理されます。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に表示します。
何かの異常やネットワーク接続エラーが起きたり、検索文字列を空で送信したりすると、例外がスローされます。そういった場合は、以下のエラーをポップアップ表示します。


