概要

JSpinnerの表記を16進数にして、そのUnicodeコードポイントに割り当てられた文字を表示します。

サンプルコード

private static DefaultFormatterFactory makeFFactory() {
  DefaultFormatter formatter = new DefaultFormatter() {
    @Override public Object stringToValue(String text) throws ParseException {
      Pattern pattern = Pattern.compile("^\\s*(\\p{XDigit}{1,6})\\s*$");
      Matcher matcher = pattern.matcher(text);
      if (matcher.find()) {
        Integer iv = Integer.valueOf(text, 16);
        if (iv <= Character.MAX_CODE_POINT) {
          return iv;
        }
      }
      Toolkit.getDefaultToolkit().beep();
      throw new ParseException(text, 0);
      // try {
      //   return Integer.valueOf(text, 16);
      // } catch (NumberFormatException ex) {
      //   Toolkit.getDefaultToolkit().beep();
      //   ParseException wrap = new ParseException(text, 0);
      //   wrap.initCause(ex);
      //   throw wrap;
      // }
    }
    @Override public String valueToString(Object value) throws ParseException {
      return String.format("%06X", (Integer) value);
    }
  };
  formatter.setValueClass(Integer.class);
  formatter.setOverwriteMode(true);
  return new DefaultFormatterFactory(formatter);
}
View in GitHub: Java, Kotlin

解説

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

  • IPAmj明朝IPAex明朝フォントがインストールされている場合、その文字の形の違いが比較可能
  • JSpinnerから取得した数値(コードポイント)から文字を生成する時、サロゲートペアなどの基本多言語面(BMP)外に対応する必要がある
  • 8.0.212-amznで実行するとゲタ文字や一部の表示が壊れる?
  • 8.0.222-amznで修正済み
    • 11.0.3-amznは正常
    • パネルのリサイズで再描画されると正常に戻ったり壊れたりする場合がある?

参考リンク

コメント