ミラーサイト作りました。今後はそちらをメインにするかも知れません。よろしくお願いします。

あれこれ備忘録 〜はてなブログ支店〜

もしもドロップシッピング」で販売サイト作ってみました。
あれこれ商店

画期的な無料家計簿アプリでお金の流れが一目で分かる

2011年06月08日

JListに画像を表示する

twitter4jを使ったjavaアプリケーションでタイムラインを取得してそれをJListに表示させようとしたけれど、文字列を表示するだけならすぐにできたのですが、画像を表示させようとすると結構面倒ですね。

JList.addElement(Object object)

となっているのでここに文字列ではなく、JLabelやJPanelを渡せばすぐに表示できるのかと思っていたのですが、そうではなかったようで。。。

JListの各リスト項目を表示するルールを決めているレンダラーを定義しなおさないといけないらしい。

そのままLabelなどを渡しても、Labelの各情報を表す文字列を表示されるのはレンダラーでObject.toString()としてそれを表示するようにしているからなのでしょう。

ということで、またサンプルコード探し。

Swing再入門 レンダラーとモデル(CodeZine)

JList (Java Platform SE 6)

レンダラーでJListの表示をカスタマイズ! - [Javaプログラミング](All About)


class SomeThing extends JLabel implements ListCellRenderer

というふうにListCellRendererインターフェースを実装するクラスを作るということなのですが、JLabelやJPanelを継承する必要はあるのでしょうか?
確かにJava公式のリファレンスJavaDocでそのようにしているわけですから間違いはないと思いますが。

理由は上のようなクラスの中でオーバライドするメソッド

public Component getListCellRendererComponent(
JList list, // the list
Object value, // value to display
int index, // cell index
boolean isSelected, // is the cell selected
boolean cellHasFocus) // does the cell have focus

の中でJLabelやJPanelを定義して、これを返り値のComponentとして返せば良いような気がするからなんです。

何か不都合でもあるんでしょうか。

Swingのいい本はないでしょうかね?

今すぐ使えるかんたんTwitterツイッター入門 今話題のTwitterをもっと楽しく! Twitterの「いまさら聞けない」疑問点を一から徹底解説。Twitterの基本的な使い方から楽しみ方までバッチリ紹介。

Twitter就活 「内定なう」の時代がやってきた! Twitterは就活の最強ツールだ! Twitterを使った企業研究、OB・OG訪問、自己PR、エントリーシート対策、面接対策などのやり方を伝授する。また、企業・採用担当者のTwitter活用法も紹介。

Java Swing Hacks 今日から使える驚きのGUIプログラミング集 原タイトル:Swing hacks Joshua Marinacci/著 Chris Adamson/著 神戸博之/監訳 島田秋雄/監訳 加藤慶彦/訳

グラフィックJava2〈Vol.2〉Swing編(下) (サンソフトプレスシリーズ)

Java GUIプログラミング さらにパワーアップしたSwing(3)


とりあえず、こんな感じで出来ました。
twitter4j java ツイッター
タグ:java JList swing
posted by まっさん at 00:01 | Comment(0) | java | このブログの読者になる | 更新情報をチェックする

2011年06月05日

Threadを作ってタブ要素を追加 Twitter4j

ホームのタイムラインやフォローしているユーザごとにタイムラインを別のタブで表示させたいとき、テキストとユーザのプロフィール画像をtwitter4jを使って読み取り、JLabelにセットし、それをJListに追加する方法を取りました。

そうすると、以前に書いたようにJListに文字列意外を表示させるためにレンダラーを設定する必要があるのと、発言ごとにユーザの情報を読み込んでJLabelに情報を書き込まないといけないので、少なくとも各タブの要素であるJListへのセット処理はスレッドで並列にさせたい。

となったときに簡単な処理なら

Thread thread = new Thread(new Runnable() {
public void run() {
//何か処理
}
});

で行けるのですが、各タブを追加するメソッドの中でこの方法を用いようとして

public void method(int var1, Object obj) {
Thread thread = new Thread(new Runnable() {
public void run() {
//var1とかobjを使った処理
}
});
}

は使えない。

new Thread()の中にいろいろ書いたものはインナークラスの一つで無名クラスというもの。

class A {
int varA = 1;
class b {
//varAを使った処理
}
}

が内部クラス。

内部クラスは大元のクラス(例ではA)のメソッドやクラス変数に簡単にアクセスができる。
無名クラスも内部クラスの一つだから同じようにできます。

しかし、先程のThreadの例ではメソッドの中で引数として定義された変数なのでこれにアクセスすることができない。

List friendsStatuses = twitter.getFriendsStatuses(-1);
if(friendsStatuses != null) {
for(User user: friendsStatuses) {
Thread thread = new Thread(new Runnable() {
public void run() {
//twitter.getUserTimeline(user.getId())を使った処理
}
});
}
}

がそれぞれのユーザごとのタイムラインをスレッドで別処理するのに書きたいコード。

だけどこれはuserへアクセス出来ないので無理。

仕方が無いので内部クラスとしてThreadを継承した別のクラスを作って

for(User user: friendsStatuses) {
WorkerThread thread = new WorkerThread(twitter.getUserTimeline(user.getId()));
thread.start();
}

のようにすることでなんとかしてみました。
posted by まっさん at 00:20 | Comment(0) | java | このブログの読者になる | 更新情報をチェックする

2011年06月03日

twitterのプロファイル画像

twitter4jで

new ImageIcon(status.getUser().getProfileImageURL())


プロファイル画像を読み込ませたところ、通常は48x48pxのところ、218x218pxの画像が出てきてしまう場合があって困ってしまいました。

User.getProfileImage()Twitter.getProfileImage()でサイズをProfileImage.MINIで指定してもダメみたい。

あと、上の場合

new ImageIcon(URL url)


でインスタンスを作っているということになるかと思いますが

new ImageIcon(String url)


の形で作るとイメージ読み込みが間に合わないのか、表示されないです。


User.getProfileImage().getURL()Twitter.getProfileImage().getURL()で画像を表示させたい場合に問題になります。

Status.getUser.getProfileImageURL()の場合とファイルの場所を指しているURLが違うのでそのせいかとも思ったのですが、

Status.getUser().getProfileImageURL().toString()にすると同様の現象が起こるので引数の違いらしいです。

解決法が知りたい。

追記:
User.getProfileImage()ではなくてTwitter.getProfileImage()でした。
posted by まっさん at 01:34 | Comment(0) | java | このブログの読者になる | 更新情報をチェックする

2011年05月29日

twitter4jでtwitterアプリを作る

twitter4jというライブラリを使うとjavaで簡単にtwitterアプリを作れるということで試してみたのですが、去年の今頃にTwitterの認証の仕組みが変更されたので、参考にするネットの情報がそのまま使えないことが多くて(探し方が下手なのせいも大きいでしょう)、すぐに出来なかった。。。

一般のユーザのタイムラインを表示するだけなら特に認証はいらないのでネット上のソースがそのまま使えました。

Twitter4Jの使い方(開発メモ)

Twitter tw = new TwitterFactory().getInstance();



でインスタンスを作って

tw.getUserTimeLine("username");



でtwitter4jのstatus型のデータが入ったリストを得る。あとはそれを出力するなり、処理をする。

問題は自分のアカウントでログインしてタイムラインを参照したり、ツイートする場合。

これは一度Twitterサイトで自分のアプリを認証させないといけないらしい。

OAuth認証とxAuth認証の二つがあるようだけど、xAuthの方はサイトにアプリの登録手続きのあとさらにメールを送って許可を得ないといけないらしいのでOAuth認証にする。

すぐに認証できるので簡単なのだが、検索してみると個人の場合は自分のサイトや組織などは空欄でいいと書いてあるところもあるが、実際はサイトは入力しなくてはいけない

あと、Twittertwitterという文字はアプリの名前には含めてはいけない

検索でヒットするいくつかのサンプルにはクラス名がTwitterを含んでいることがあるからそのまま使って作ったプログラムを登録しようとすると引っかかる。


登録できたら、登録後のページにあるConsumer KeyConsumer Secretというところの暗号のような文字列をメモしておいて、つくろうとしているJavaアプリのソースに入力する。



しかし、この二つの値をどこに記録するかが面倒でした。

本家のサンプルコードのページにはその名のとおりサンプルのソースがある。

ただ、
サンプルコードを動作させるには OAuth の認証情報を twitter4j.properties 記載しておく必要があります。


と書かれてある。

別ファイルをテストの段階で作るのも面倒なので、ソースでこの二つを引数で渡せないかと思って別のサイトを検索してみると

Twitter4Jを使ったTwitterのOAuth認可サンプル(NI-Lab.'s ヅラッシュドット)が見つかった。

しかし、ここの

factory.getOAuthAuthorizedInstance(consumerKey, consumerSecret);



が今のtwitter4jには無いみたい。

どうするのかと思っていろいろ探したのだけど、結局、さっきの本家サンプルコードのページにOAuth認可のセクションがあって、

Twitter#setOAuthConsumer()を使うとありました。

いやあ、長かった。

結論としてはヅラッシュドットのサンプルのソースの

Twitter twitter = factory.getOAuthAuthorizedInstance(consumerKey, consumerSecret);





Twitter twitter = factory.getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);



に変更すればいいだけでした。

JavaDocをきちんと理解できればこんなことにはならないんですけどね。。。

とにかく表示はできたからよしとしよう。

GALAPAGOS SoftBank 005SH Twitterやブログが楽しい フルキーボード搭載 3D対応スマートフォン

30% off Twitterrific公認 twitter ツイッター フィギュア 白黒 リミテッド100個 全世界限定100個 レア ツイッターのAppで有名なTwitterrificのアイコンのフィギュアです。こちらの白黒バージョンは全世界100体限定となります。約10センチです。日本では手にすることが出来ない非常に珍しい品になります。

Twitter APIリファレンスガイドブック―Twitterアプリを開発する

カフス Twitter ツイッター ! カフスボタン 今話題のTwitterのロゴをあしらったカフリンクス

うーさー ダースウーサーTシャツ カリフォルニアオレンジ サイズ:L 「supercell」のメンバーにしてデザイナー 宇佐氏のマスコットキャラクター。Twitterタイムライン上に生息するが、その発言を見たものは数少ないといわれる謎の黒獣『ダースウーサー』をプリントした、宇佐氏によるデザインのTシャツ!
posted by まっさん at 16:38 | Comment(1) | java | このブログの読者になる | 更新情報をチェックする

2011年04月25日

method(int arg1, int... args)

method(int arg1, int... args)
int... は可変長引数を表す。
j2se5.0(jdk1.5)から導入。

参考リンク
J2SE 5.0 虎の穴 Java2 SE v5.0 Tiger の新機能(Java in the Box)
posted by まっさん at 12:13 | Comment(0) | java | このブログの読者になる | 更新情報をチェックする

iPagerank ブログランキング・にほんブログ村へ
にほんブログ村 ランキングはこちらをクリック!

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。