つぶやきを検索する
このアプリケーションを構成する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に表示します。
何かの異常やネットワーク接続エラーが起きたり、検索文字列を空で送信したりすると、例外がスローされます。そういった場合は、以下のエラーをポップアップ表示します。