2009/11/22

AjaxFallbackDefaultDataTableのカラム幅指定(2)

やっぱり簡単な方法があった。
public Page(){
List<IColumn<Score>> columns = new ArrayList<IColumn<Score>>();
columns.add(new PropertyColumn<Score>(new Model<String>("打順"), "order"){
public String getCssClass() {
return "orderClass";
}

});
add(new AjaxFallbackDefaultDataTable<Score>(
"scores", columns
, new ScoreDataProvider(), 10
));


こんな感じで、カラムのgetCssClassをオーバーライドして適当な値を返せばthタグのclassとして出力されるので、スタイルシートで

th.orderClass{ width: 20%}

ってやっとけば幅を指定できる。前回のコードからわかるように、Columnは実際にはthやtdの下に位置するんだけど、getCssClassが返す結果はthやtdに反映される。
前回のと同じ結果ではないけど、はるかにシンプルにできるので、わざわざ前回のコンポーネント階層を辿るより全然良い。

2009/11/15

AjaxFallbackDefaultDataTableのカラム幅指定

AjaxFallbackDefaultDataTableが作ってくれるテーブルの、各カラムのサイズを指定したくていろいろ調べてみたけど、なかなか良い方法が見つからなかった。一応実現できたけど、むちゃくちゃ強引な気がする。

public Page(){
DataTable table = new AjaxFallbackDefaultDataTable( ... );

MarkupContainer headers = (MarkupContainer)get(table, "topToolbars/2/toolbar/headers");
if(headers != null){
get(headers, "1/header").add(new AttributeAppender("width", new Model("20%"), ""));
get(headers, "2/header").add(new AttributeAppender("width", new Model("20%"), ""));
get(headers, "3/header").add(new AttributeAppender("width", new Model("60%"), ""));
}
}

private static Component get(MarkupContainer root, String path){
String[] paths = path.split("\\/");
MarkupContainer current = root;
for(String p : paths){
Component c = current.get(p);
if(c == null) return null;
if(!(c instanceof MarkupContainer)) return null;
current = (MarkupContainer)c;
}
return current;
}

こんなんでいいのかね。

2009/11/04

Wicket勉強中(DropDownChoice)

Apache Wicketを再勉強中。DropDownChoiceを使う最もシンプルなコードを作ってみた。

public class Sample extends WebPage{
public Sample() {
Form form = new Form("form");
form.add(new DropDownChoice("result"
, new PropertyModel(this, "resultChoiceSelection")
, Arrays.asList("エラー", "安打", "二塁打", "三塁打", "ホームラン")
));
form.add(new Button("submit"));
add(form);
}
private String resultChoiceSelection;
}

PropertyModelの行削ったり、変わりにListModelだったりすると、submit時に例外が起こる。これってバグと言っていいと思うけどなぁ。

2008/12/17

AJDTやAspectJをベースにしたツールの開発

Developer's guide to building tools on top of AJDT and AspectJ
AJDTやAspectJをベースにしたツールの開発ガイド。

EclipseプラグインからAJDTを利用する方法や、AspectJのパーザ(.ajファイルパーザ)を利用する方法が解説されてる。

Java6 on MacOS X では Eclipse は動作しない

どうせならEclipseもJava6上で動かしてやろうと、Info.plistを編集してJava6を指定し、起動するとエラーが出た。

調べてみると、MacのJava6自体は64bitで実装されているが、SWTが32bitにしか対応していないためらしい。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=239301によると、現在SWTをCarbonからCocoaに移植してる(CocoaSWT)最中で、それが終わってから、Eclipse3.5くらいで64bit対応できるといいなぁって程度らしい。

ちなみにCocoaSWTの移植が終わるのはSWT3.5のM6、March 13, 2009。
64bit版はいつになることやら。

2008/12/13

LeopardのJava6でJavaFX1.0をスクリプティングAPI(JSR223)経由で実行する

JavaFX1.0がリリースされたので、早速Macで動かしてみた。JavaFXとして起動するともちろん動くんだけど、Javaからスクリプトとして実行すると、うまくいかない。

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: com.sun.tools.javac.main.RecognizedOptions.getJavacFileManagerOptions(Lcom/sun/tools/javac/main/RecognizedOptions$OptionHelper;)[Lcom/sun/tools/javac/main/JavacOption$Option;
at com.sun.tools.javac.util.JavacFileManager.(JavacFileManager.java:973)
at com.sun.tools.javafx.api.JavafxcTool.getStandardFileManager(JavafxcTool.java:102)
at com.sun.tools.javafx.script.JavaFXScriptCompiler.compile(JavaFXScriptCompiler.java:97)
at com.sun.tools.javafx.script.JavaFXScriptEngineImpl.parse(JavaFXScriptEngineImpl.java:206)
...

javac関連のクラスが競合していてエラーが出てる。調べてみると、事情は少々複雑なようだ(後述)。解決策としては、プログラムを実行するJava6に、javafxc.jarを優先的にロードさせればいい。

Eclipseで実行する場合、Installed JREsからJVMの実行環境を編集し、/System/Library/Frameworks/JavaFX.framework/Versions/1.0/lib/shared/javafxc.jarを追加して先頭に持ってくる。

コマンドラインからは試してないけど、おそらくbootclasspathオプションが使えるはず。


何故そんなことになるかだけど、これは2つの事情が関係している。

Mac側の事情は、Javaのclasses.jarに、Windowsで言うところのtools.jarの内容が含まれていること。何故こうなってるかはわからないんだけど、調べてみるとこれでが原因で、いろんなソフトウェアではまっている人が結構居るようだ(といってもtools.jar前提のソフト自体限られるけど)。

JavaFX側の事情は、スクリプトのコンパイラであるjavafxc.jarに、こちらもtools.jarの内容が含まれていること。これは、JavaFXがスクリプトからバイトコードを生成するものなので、理解はできる。但し、その内容がJava5相当のものになっている。Java6 update10とセットかの用に語られているけど、実はMacではJDK5 Update 13(Appleの表現だとLeopardでUpdate 2相当)以降で動作するようになっている(WindowsではJDK6 Update 7以降)ためのようだ(JavaFX 1.0 SDK Requirements参照)。

それぞれ事情があり、Mac側の事情はたいしたこと無さそうだけど(tools.jarに切り出すことは簡単なはず)Appleがわざわざそうするとも思えないので、根本的な解決が計られることは無いような気がする。困ったもんだ。

2008/06/19

Ganymede(Eclipse3.4)用AJDTとSubclipse

Subclipse 1.4(Subversionは1.5らしい)
http://subclipse.tigris.org/update_1.4.x

AJDT 3.4
http://download.eclipse.org/tools/ajdt/34/dev/update

どちらもMac上のGanymede(RC4)で動いてます。SbclipseはSubversionクライアントのインストールも忘れずに。Mac上ではJavaHLは動きませんが(Windowsのみっぽい)、SVNKitは動作します。

2008/06/15

WhiteDogプロジェクト再スタート

http://code.google.com/p/whitedog/

未踏以来(対外的には)大きな進展が無かったWhiteDogですが、一から設計をやり直して再スタートさせました。
これを機にライセンスもオープン(Apache License 2.0)にしました。

とりあえずGUIは無しにして、アノテーションを中心にした開発用ライブラリを時間をかけて設計しながら作っていく予定です。

特徴として

  • アノテーションベース

  • 交換可能なプロトコル(とりあえずローカル(in-vm or in-classloader)とUDPマルチキャスト(JGroups)をサポート)


を考えてます。

2008/03/27

AJDT1.5.2とAJDT1.6.0

AJDT1.5.2(with AspectJ1.6.0m1)とAJDT1.6.0(with AspectJ1.6.0m2)が出てます。
どちらもdevelopment buildです。

AJDT1.5.2(with AspectJ1.6.0m1) for Eclipse 3.3
http://download.eclipse.org/tools/ajdt/33/dev/update
http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg08715.html

AJDT1.6.0(with AspectJ1.6.0m2) for Eclipse 3.4
http://download.eclipse.org/tools/ajdt/34/dev/update
http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg08894.html

AspectJ1.6.0m2では、Parameter Annotation Matchingも使えます! さらにアノテーションパラメータを静的にマッチングすることも可能です(クラス型と配列、パラメータアノテーションは未実装)
http://www.eclipse.org/aspectj/doc/released/README-160.html

around executionが適用されたメソッドの変数情報が欠落する - 3

過去のエントリー:
around executionが適用されたメソッドの変数情報が欠落する
around executionが適用されたメソッドの変数情報が欠落する - その後

https://bugs.eclipse.org/bugs/show_bug.cgi?id=173978
1.6.1に持ち越されました。
気付けばもう1年以上修正されてない。それだけ需要無いのかな。
まぁ僕もbefore/afterで処理できたので取り急ぎ困ってないんだけど。