Swing/CodePointAtCaret のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- 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
概要
JTextArea
内にあるCaret
の隣の位置にある文字のUnicode
コードポイントをJTextField
に表示します。
Screenshot
Advertisement
サンプルコード
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 in GitHub: Java, Kotlin解説
上記のサンプルでは、JTextArea
にCaretListener
を設定して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
は、カラー絵文字には対応していない
参考リンク
- String#codePointAt(int) (Java Platform SE 8)
- Character#isHighSurrogate(char) (Java Platform SE 8)
- JTextComponentでサロゲートペアのテスト