TITLE:JSpinnerの表記を16進数にする
#navi(../)
#tags(JSpinner, DefaultFormatter, Font)
RIGHT:Posted by &author(aterai); at 2013-06-03
*JSpinnerの表記を16進数にする [#gd25fd97]
``JSpinner``の表記を``16``進数にして、その``Unicode``コードポイントに割り当てられた文字を表示します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh4.googleusercontent.com/-eTZU_kuJGK4/UauUgRcPuTI/AAAAAAAABtc/7FNouA9JcLI/s800/HexFormatterSpinner.png)

**サンプルコード [#t5f5a11f]
#code(link){{
DefaultFormatter hexformatter = new DefaultFormatter() {
  @Override public Object stringToValue(String text) throws ParseException {
    try{
      return Integer.valueOf(text, 16);
    }catch(NumberFormatException nfe) {
      throw new ParseException(text, 0);
    }
  }
  private final String MASK = "000000";
  @Override public String valueToString(Object value) throws ParseException {
    String str = MASK + Integer.toHexString((Integer)value).toUpperCase();
    int i = str.length() - MASK.length();
    return str.substring(i);
  }
};
hexformatter.setValueClass(Integer.class);
hexformatter.setOverwriteMode(true);

}}

**解説 [#vce45de0]
上記のサンプルでは、``DefaultFormatter#stringToValue(String)``と``DefaultFormatter#valueToString(Object)``をオーバーライドして、``0``から``0x10FFFF``までの整数を``16``進数で表示する``Formatter``を作成し、``JSpinner``に設定しています。

----
- ``JSpinner``から取得した数値(コードポイント)から文字を生成する時、サロゲートペアなどの基本多言語面(BMP)外に対応するために以下のような方法を使用しています。
-- 参考: [http://docs.oracle.com/javase/tutorial/i18n/text/usage.html Sample Usage (The Java™ Tutorials > Internationalization > Working with Text)]

#code{{
int code = ((Integer)spinner.getValue()).intValue();
char[] ca = Character.toChars(code);
String str = new String(Character.toChars(code));
}}

----
IPAmj明朝とIPAex明朝フォントがインストールされている場合、その文字の形の違いを比較することができます。

- [http://mojikiban.ipa.go.jp/download.html IPAmj明朝フォントダウンロード | IPA 文字情報基盤]
- [http://ipafont.ipa.go.jp/ IPAexフォント/IPAフォント]

**参考リンク [#ga82bd73]
- [[Fontのアウトラインを取得して文字列の内部を修飾する>Swing/LineSplittingLabel]]
- [http://f.hatena.ne.jp/NAOI/20130411131759 IPAmj明朝とIPAex明朝で形の違う字 NAOI's fotolife - 20130411131759]

**コメント [#td71f10f]
#comment