アンダースコアの直後に数字が続くJTextFieldを、下付き文字に即座に変更するJTextFieldを作成しています。replaceAllに関連する正規表現コードについてサポートが必要です。正規表現グループについて少し読んだことがありますが、この場合、アンダースコアの後の番号を取得する方法を完全には理解していません。
添え字コード:
// Only 0 - 9 for now...
private String getSubscript(int number)
{
String[] sub = {"\u2080", "\u2081","\u2082","\u2083","\u2084","\u2085","\u2086","\u2087","\u2088","\u2089" };
return sub[number];
}
更新コードを挿入:
public void insertUpdate(DocumentEvent e) {
if (textField.getText().contains("_"))
{
SwingUtilities.invokeLater(this);
}
}
実際の置換が行われる場所(DocumentListenerメソッドでテキストフィールドを直接編集できないため:
public void run()
{
textField.setText(textField.getText().replaceAll("_([0-9])+", getSubscript(Integer.getInteger("$1"))));
}
これにより、run()メソッドでNullPointer例外がスローされます。
編集:
出力例を次に示します。
ユーザーが「H_2」と入力すると、すぐに「H₂」になり、「H₂O_2」を続けてすぐに「H₂O₂」になります。