JavaFX で文字列のセンタリング

JavaFX を久々に使って驚いたのは,テキストを含めたノードのAlignmentがまだ正常に動いていなかったこと.0.9ではちゃんと動いたのに,1.0で動かなくなり,1.2でも動かない.これが特に困るのはテキストのセンタリング.テキストはレンダリングしてみないとサイズがわからないので,配置を決められないのだ.Java だとFontMetricで,サイズを求めて配置するのだが,JavaFXにはこのクラスに相当する機能がない.というか,Textオブジェクトのサイズはレンダリングした後では取得できるのだけど,それを使って配置しようとすると,いやなループがおきて,スタックオーバーフローする.

この件は,フォーラムでも話題になっており,2008年の12月には,中の人が,「
We weren't happy with the original alignment API so we removed it. A better replacement is planned for the next release. 」なんて書いているのだが,その後も治っていない(のだと思う).

で,このスレッドの最後で紹介されているのが,
JavaのレイアウトライブラリMigLayoutを使う方法.MigLayoutはJavaの発狂寸前のレイアウトを補うライブラリなのだが,このライブラリを,
JFXtrasというJavaFX拡張ライブラリを介して利用することで,テキストのセンタリングができる.ちなみに,JFXtrasには,さまざまなツールキットが含まれており,MigLayout機能はそのごく一部にすぎない.

導入

結構面倒くさい.JFXtrasの配布物には,MigLayoutは含まれていないので,別途ここからダウンロードしなければならない.

使い方

四角の中に,文字列を配置する場合はこんな感じ.
ああ,面倒だ,面倒だ...

content: [
  Rectangle {
    width: bind width
    height: bind height
  },
  MigLayout {
    width: bind width
    height: bind height
    constraints: "fill"
    content: [ 
      Text {
        content: "Hello"
        font: bind Font {
          name: 'Verdana',
          size: fontSize
        }
       layoutInfo: MigLayout.nodeConstraints(
                   "alignx center, aligny center") 
     }
   ]
  }
]

追記 (10/25)

hide1080さんに,トラックバックでコメントをいただき,もっとずっといい方法を教えていただきました.ありがとうございました.

2つ教えていただきましたが,Stack を使う方法が簡単そうです.