JavatterAdventCalendarその5

by orekyuu 0 Comments

JavatterAdventCalendarの16日目の記事です。

今回はFXMLを使ってGUIの作成をします。
JavaFXではSwingのようにソースコードでレイアウトを作るだけでなく、FXMLと呼ばれるXMLのような言語でレイアウトを作成することが可能です。
今回はFXMLを使ってGUIを作成し、ボタンをクリックすることで新規ウィンドウでFXMLのGUIを表示してみます。

まずはFXMLを作成します。

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<BorderPane id="BorderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
  <center>
    <Label text="WindowTest" />
  </center>
</BorderPane>

BorderPaneのCenterにLabelを配置しているだけです。
直接手書きをしてもいいですが、SceneBuilderを使うことにより簡単に作成することが可能です。
SceneBuilder

SceneBuilderはこちらからDLできます。

次にこれを読み込みます。
JavatterFxmlLoader#load(Class,String)を使って読み込むことが出来ます。
第一引数にはFXMLと同じパッケージに属しているClassを渡し、第二引数にはFXMLのファイル名を渡します。

あとはWindowを開いてloadで戻ってきたParentを設定して完成です。

try {
	Parent p=JavatterFxmlLoader.load(getClass(), "TestWindow.fxml");//ロード
	Scene scene=new Scene(p);//シーンを作成
	Stage stage=new Stage();//新しいステージ(Window)を作成する
	stage.setScene(scene);//ステージにシーンを設定」
	stage.centerOnScreen();//ステージを画面中央へ
	stage.setTitle("TestWindow");//タイトルを設定
	stage.show();//表示
} catch (IOException e) {
	e.printStackTrace();
}

これで読み込み完了です。あとはボタンをクリックした時この処理をするようにしましょう。

@EventHandler
	public void onCreateTweetobject(final EventInitializeTweetobject event){
		MenuItem item=new MenuItem("Window");
		event.getController().addMenuItem(item);
		item.setOnAction(new javafx.event.EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				try {
					Parent p=JavatterFxmlLoader.load(getClass(), "TestWindow.fxml");//ロード
					Scene scene=new Scene(p);//シーンを作成
					Stage stage=new Stage();//新しいステージ(Window)を作成する
					stage.setScene(scene);//ステージにシーンを設定」
					stage.centerOnScreen();//ステージを画面中央へ
					stage.setTitle("TestWindow");//タイトルを設定
					stage.show();//表示
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}

次回はGUIを操作するコントローラーの解説をする予定です。お疲れ様でした。

JavatterAdventCalendarその4

by orekyuu 0 Comments

JavatterAdventCalendarの14日目の記事です。

今回はイベントの自作をする方法を解説します。
今回はMyPluginInitEventを自作してPlugin.Initでイベントを発生させます。

イベントの作成はとても簡単です。
com.github.orekyuu.javatterfx.event.Eventインターフェイスを実装させるだけです。
このインターフェイスはマーカーインターフェイスになっていてメソッドをオーバーライドする必要はありません。

package com.orekyuu.plugin.test.events;

import com.github.orekyuu.javatterfx.event.Event;

public class MyPluinInitEvent implements Event{

}

次にこのイベントを通知します。
通知はEventManager#eventFire(Event)を使って行います。
適当なタイミングでこのメソッドを呼び出し、引数には起こしたいイベントのインスタンスを渡します。

EventManager.INSTANCE.eventFire(new MyPluinInitEvent());

これでイベントの自作はできました。
イベントで値を渡したい場合はEventを実装したクラスに変数を持たせておき、インスタンス作成時に適当な値を設定してからeventFireをすることで可能です。

お疲れ様でした。

JavatterAdventCalendarその3

by orekyuu 0 Comments

JavatterAdventCalendar自分の記事3つ目です。
今回はイベントシステムを使ってJavatterのボタンを増やします。
デモとしてやよい軒ボタンを追加します。
やよい軒

ツイートのセルが作られた時のイベントを取得してセルのオブジェクトを編集することで追加することが出来ます。
イベントリスナにEventInitializeTweetobjectを引数にすればセルが作られた時に呼び出される様になります。
受け取ったEventからgetControllerでコントローラを取得し、addMenuItemでMenuItemを追加すれば大丈夫です。

@EventHandler
public void createButton(final EventInitializeTweetobject event){
	MenuItem item=new MenuItem("やよい軒");
	event.getController().addMenuItem(item);
	item.setOnAction(new javafx.event.EventHandler<ActionEvent>() {
		@Override
		public void handle(ActionEvent arg0) {
			Status status=event.getController().getStatus();
			String user=status.getUser().getScreenName();
			StatusUpdateBuilder builder=new StatusUpdateBuilder("@"+user+" やよい軒ええぞやよい軒");
			builder.setReplyID(status);
			TweetDispenser.tweet(builder.create());
		}
	});
}

3行目のMenuItemはボタンに追加するアイテムです。
4行目でMenuItemを追加しています。
5行目ではsetOnActionでEventHandlerの匿名クラスを作成し、押された時の動作を定義しています。
StatusUpdateBuilderは、UpdateStatusを作成するためのクラスです。コンストラクタに呟きたい文字列を与え、setReplyIDでリプライを設定しています。
他にも画像を添付したりすることも可能です。
そしてcreateメソッドでUpdateStatusを作成し、TweetDispenserでツイートしています。

動作確認をしてみて動けば完成です。お疲れ様でした。

JavaFXでTwitterクライアント作ってみた。

by orekyuu 0 Comments

この記事はJavaFX Advent Calendarの12日目です。
前回は@kisさんのJavaFXでSeleniumっぽいものを作るでした。

・JavaFXでTwitterクライアント作ってみた
今年の春頃にSwingを使ってJavatterというTwitterクライアントをすでに作っていて、完成した後にJavaFXの存在を知ってJavaFXで新しく作りなおすことにしました。

こちらがSwingで作ったクライアントです。
JavatterSwing

そしてJavaFXで作りなおしたのがこちらです。
JavatterFX

JavaFX、結構シャレオツだと感じました。Swingがださすぎたのか?

・JavaFXの話
JavaFXでブラウザを開く方法を紹介します。

今までは

Desktop.getDesktop().browse(new URL("https://www.google.co.jp/").toURI());

のようにDesktopクラスを使ってブラウザを開いていました。

JavaFXを使ってブラウザを立ち上げるにはHostServices#showDocument(String)を使います。

Application app;
app.getHostServices().showDocument("https://www.google.co.jp/");

・おわり
今回紹介したTwitterクライアントのソースはこちらで見れます。

Swingなんてなかったんや!JavaFXすごい!ということで私の記事はおしまいです。
ありがとうございました!

JavatterAdventCalendarその2

by orekyuu 0 Comments

JavatterAdventCalendarの9日目の記事です。

今回はJavatterのイベントシステムについて解説します。
今回はデモとしてユーザーストリームを取得して、「JavaJava」という発言に対して「@ユーザー名 じゃばっ」とリプライを送るプラグインを作ってみます。

JavatterFX本体はここからダウンロードするかGithubからクローンして自分でビルドしてください。

まずは前回と同じようにロードされた時に動くPluginMainクラスを作りましょう。
Plugin.Initができれば、次にイベントを受け取るリスナクラスを作成します。
今回はMyEventListenerというクラス名にしておきます。
MyEventListenerにはcom.github.orekyuu.javatterfx.event.Listenerを実装する必要があります。

次にイベントを受け取るメソッドを作ります。
今回はユーザーストリームから新しいStatusが来た時のイベントを受け取るメソッドを作ります。

@EventHandler
public void onStatus(EventStatus event){
	
}

メソッドの引数に受け取りたいイベントのクラスを設定し、EventHandlerアノテーションをつけることで引数のイベントに応じて適切なタイミングで呼び出されます。
メソッドの名前は自分の好きな名前で構いません。
あとはツイートの内容がJavaJavaであるかどうかを比較してTweetDispenser#tweetメソッドでつぶやけばリスナは完成です。

最後にこのリスナを登録します。
PluginMainのPlugin.Initが付加されたメソッドで登録しましょう。
EventManager#addEventListener(Listener)を使って登録します。

これで完成です。起動して動作を確認してみましょう。
ソースコードをここに書いておきます。
PluginMain

package com.github.orekyuu.plugin;

import com.github.orekyuu.javatterfx.event.EventManager;
import orekyuu.plugin.loader.Plugin;

@Plugin(name = "じゃばっプラグイン", version = "1.0")
public class PluginMain {

	@Plugin.Init
	public void init(){
		EventManager.INSTANCE.addEventListener(new MyEventListener());
	}
}

MyEventListener

package com.github.orekyuu.plugin;

import com.github.orekyuu.javatterfx.event.EventHandler;
import com.github.orekyuu.javatterfx.event.Listener;
import com.github.orekyuu.javatterfx.event.stream.EventStatus;
import com.github.orekyuu.javatterfx.util.TweetDispenser;

public class MyEventListener implements Listener{

	@EventHandler
	public void onStatus(EventStatus event){
		if(event.getTweetText().equals("JavaJava")){
			TweetDispenser.tweet("@"+event.getAccount()+" じゃばっ");
		}
	}
}

JavatterAdventCalendarその1

by orekyuu 0 Comments

JavatterAdventCalendar4日目です。
自分の記事ではSwingで作られているJavatterβの方ではなく、現在開発中のJavatterFXについて書こうと思います。

1回目はJavatterFXのプラグインの作成方法です。
今回は起動直後にHelloJavatterFXと呟くプラグインを作成してみます。

開発に必要になるので、本体を準備しましょう。
ここからダウンロードするかGithubからクローンして自分でビルドしてください。

まずはロードされた時に呼ばれるクラスを作成します。
今回はcom.github.orekyuu.plugin.PluginMainクラスを作成。
そしてorekyuu.plugin.loader.Pluginをインポートし、PluginアノテーションをPluginMainクラスに付けます。
nameにはプラグインの名前を文字列で与えます。
versionにはバージョンを文字列で与えます。

package com.github.orekyuu.plugin;

import orekyuu.plugin.loader.Plugin;

@Plugin(name = "プラグイン名", version = "1.0")
public class PluginMain {

}

次にロード時に呼ばれるメソッドを定義します。
@Plugin.Initアノテーションが付加されたメソッドはプラグインがロードされた時に実行されます。
メソッド名は好きな名前で構いません。

@Plugin.Init
public void init(){

}

今回はロードされた時につぶやきたいので、initの段階でつぶやくことにします。
ツイートをするにはcom.orekyuu.javatterfx.util.TweetDispenserを使用します
TweetDispenserのtweetメソッドはツイートをQueueに加え、別のスレッドで順番に処理されます。
JavatterβのTwitterUtilのtweetメソッドでは完全に別のスレッドでツイート処理が行われていたため、ツイートの順番は保証されていませんでしたが、TweetDispenserは呟く順番が保証されます。

ソースコードが完成しました。一応コードを載せておきます。

package com.github.orekyuu.plugin;

import orekyuu.plugin.loader.Plugin;

import com.github.orekyuu.javatterfx.util.TweetDispenser;

@Plugin(name = "プラグイン名", version = "1.0")
public class PluginMain {

	@Plugin.Init
	public void init(){
		TweetDispenser.tweet("Hello!JavatterFX");
	}
}

プラグインの配布方法はJarファイルとして出力するだけです。JavatterFXはロードされたクラスの中からPluginアノテーションの付加されたクラスを検索するのでマニフェストファイルの編集は必要ありません。
実際に実行してみてHello!JavatterPluginとツイートできていれば完成です。お疲れ様でした。

JavatterAdventCalendar

by orekyuu 0 Comments

なんかできてました。
http://www.adventar.org
12月4日にJavatterFXのプラグインについて少し書きたいと思ってます。よろしくお願いします。

JavatterFXの進捗はいいかんじです。メモリリークのバグとレイアウトが崩れるバグが直った感じです。
厄介なのはツイートのハイパーリンクだけですね・・・頑張ります。