Swing/CodePointAtCaret の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/CodePointAtCaret へ行く。
- Swing/CodePointAtCaret の差分を削除
--- category: swing folder: CodePointAtCaret title: JTextArea内にあるCaret位置の文字のUnicodeコードポイントを表示する tags: [Caret, JTextArea, Font] author: aterai pubdate: 2018-05-28T15:48:29+09:00 description: JTextArea内にあるCaretの隣の位置にある文字のUnicodeコードポイントをJTextFieldに表示します。 image: https://drive.google.com/uc?id=1t5jI8FiHF3xA21GNY307MZtNBUX5jP-O1A hreflang: href: https://java-swing-tips.blogspot.com/2020/02/display-unicode-code-point-of-character.html lang: en --- * 概要 [#summary] `JTextArea`内にある`Caret`の隣の位置にある文字の`Unicode`コードポイントを`JTextField`に表示します。 #download(https://drive.google.com/uc?id=1t5jI8FiHF3xA21GNY307MZtNBUX5jP-O1A) * サンプルコード [#sourcecode] #code(link){{ String u1F60x = "😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏"; String u1F61x = "😐😑😒😓😔😕😖😗😘😙😚😛😜😝😞😟"; String u1F62x = "😠😡😢😣😤😥😦😧😨😩😪😫😬😭😮😯"; String u1F63x = "😰😱😲😳😴😵😶😷😸😹😺😻😼😽😾😿"; // String u1F64x = "🙀🙁🙂 🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏"; 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(); } }); }} * 解説 [#explanation] 上記のサンプルでは、`JTextArea`に`CaretListener`を設定して`Caret`位置にある文字を取得し、`String#codePointAt(...)`メソッドを使用してその文字の`Unicode`コードポイントを編集不可にした`JTextField`に表示しています。 - `Caret`の位置は、`CaretEvent#getDot()`メソッドで取得 - `Caret`の位置は`CaretEvent#getDot()`メソッドで取得 - 文字列選択されている場合(`CaretEvent#getDot() - CaretEvent#getMark() != 0`)はなにも表示しない - `Caret`の位置の文字は、`JTextArea.getDocument().getText(dot, 1)`で取得しているため、サロゲートペアの場合は`String#codePointAt(...)`でも`Unicode`上位サロゲートコード単位になる - `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`は、カラー絵文字には対応していない - `JTextArea.getText().codePointAt(dot)`を使用する場合は文字列末尾で`StringIndexOutOfBoundsException`が発生するので注意が必要 - `Swing`の`JTextComponent`を継承する`JTextArea`などはカラー絵文字には対応していない * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#codePointAt-int- String#codePointAt(int) (Java Platform SE 8)] - [https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Character.html#isHighSurrogate-char- Character#isHighSurrogate(char) (Java Platform SE 8)] - [[JTextComponentでサロゲートペアのテスト>Swing/SurrogatePair]] * コメント [#comment] #comment #comment