概要

JTextArea内にあるCaretの隣の位置にある文字のUnicodeコードポイントをJTextFieldに表示します。

サンプルコード

String u1F60x = "😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏";
String u1F61x = "😐😑😒😓😔😕😖😗😘😙😚😛😜😝😞😟";
String u1F62x = "😠😡😢😣😤😥😦😧😨😩😪😫😬😭😮😯";
String u1F63x = "😰😱😲😳😴😵😶😷😸😹😺😻😼😽😾😿";
String u1F64x = "🙀🙁🙂  🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏";

JTextField label = new JTextField();
label.setEditable(false);
label.setFont(label.getFont().deriveFont(32f));

List<String> l = Arrays.asList(u1F60x, u1F61x, u1F62x, u1F63x, u1F64x);
JTextArea textArea = new JTextArea(String.join("\n", l));
textArea.addCaretListener(e -> {
  try {
    int dot = e.getDot();
    int mark = e.getMark();
    if (dot - mark == 0) {
      Document doc = textArea.getDocument();
      String txt = doc.getText(dot, 1);
      int code = txt.codePointAt(0);
      if (Character.isHighSurrogate((char) code)) {
        txt = doc.getText(dot, 2);
        code = txt.codePointAt(0);
      }
      label.setText(String.format("%s: U+%04X", txt, code));
    } else {
      label.setText("");
    }
  } catch (BadLocationException ex) {
    ex.printStackTrace();
  }
});
view all

解説

上記のサンプルでは、JTextAreaCaretListenerを設定してCaret位置にある文字を取得し、String#codePointAt(...)メソッドを使用してその文字のUnicodeコードポイントを編集不可にしたJTextFieldに表示しています。

  • Caretの位置は、CaretEvent#getDot()で取得
  • 文字列選択されている場合(CaretEvent#getDot() - CaretEvent#getMark() != 0)はなにも表示しない
  • Caretの位置の文字は、JTextArea.getDocument().getText(dot, 1)で取得しているため、サロゲートペアの場合はString#codePointAt(...)でもUnicode上位サロゲートコード単位になる
    • Character.isHighSurrogate(char)メソッドでUnicode上位サロゲートコード単位かを調査し、サロゲートペアの場合はJTextArea.getDocument().getText(dot, 2)で取得した文字列のUnicodeコードポイントを取得する
  • JTextArea.getText().codePointAt(dot)を使用する場合は、文字列末尾でStringIndexOutOfBoundsExceptionが発生するので注意が必要
  • JTextAreaは、カラー絵文字には対応していない

参考リンク

コメント