概要

DocumentFilterを使って、文字列の先頭が常に大文字になるように設定します。

サンプルコード

class FirstCharToUpperCaseDocumentFilter extends DocumentFilter {
  private final JTextComponent textField;
  protected FirstCharToUpperCaseDocumentFilter(JTextComponent textField) {
    super();
    this.textField = textField;
  }

  @Override public void remove(
      DocumentFilter.FilterBypass fb, int offset, int length)
      throws BadLocationException {
    Document doc = fb.getDocument();
    if (offset == 0 && doc.getLength() - length > 0) {
      fb.replace(length, 1,
                 doc.getText(length, 1).toUpperCase(Locale.ENGLISH), null);
      textField.setCaretPosition(offset);
    }
    fb.remove(offset, length);
  }

  @Override public void replace(
        DocumentFilter.FilterBypass fb, int offset, int length,
        String text, AttributeSet attrs) throws BadLocationException {
    String str = text;
    if (offset == 0 && Objects.nonNull(text) && !text.isEmpty()) {
      str = text.substring(0, 1).toUpperCase(Locale.ENGLISH) + text.substring(1);
    }
    fb.replace(offset, length, str, attrs);
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JTextFieldに入力された文字列の先頭一文字が、常に大文字になるように変換するDocumentFilterを設定しています。

  • JFormattedTextField + MaskFormatterを使用すると指定した文字列長に足りない場合などでアンドゥが実行される
    field1 = new JFormattedTextField(new MaskFormatter("ULLLLLLLLLL"));
    

参考リンク

コメント