• title: DocumentFilterで先頭文字を大文字に変換する tags: [JTextField, DocumentFilter] author: aterai pubdate: 2010-03-01T12:38:41+09:00 description: DocumentFilterを使って、文字列の先頭が常に大文字になるように設定します。

概要

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

サンプルコード

class FirstCharToUpperCaseDocumentFilter extends DocumentFilter {
  private final JTextComponent textArea;
  public FirstCharToUpperCaseDocumentFilter(JTextComponent textArea) {
    super();
    this.textArea = textArea;
  }
  @Override public void insertString(
      FilterBypass fb, int offset, String text, AttributeSet attrs)
      throws BadLocationException {
    if(text==null) return;
    replace(fb, offset, 0, text, attrs);
  }
  @Override public void remove(
      FilterBypass fb, int offset, int length) throws BadLocationException {
    Document doc = fb.getDocument();
    if(offset==0 && doc.getLength()-length>0) {
      fb.replace(0, length+1, doc.getText(length, 1).toUpperCase(), null);
      textArea.setCaretPosition(0);
    }else{
      fb.remove(offset, length);
    }
  }
  @Override public void replace(
      FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
      throws BadLocationException {
    if(offset==0 && text!=null && text.length()>0) {
      text = text.substring(0,1).toUpperCase()+text.substring(1);
    }
    fb.replace(offset, length, text, attrs);
  }
}
View in GitHub: Java, Kotlin

解説

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


以下のように、JFormattedTextField + MaskFormatterを使うと、先頭文字を削除した場合などで空白文字が挿入される(長さが決まっているから?)。

JFormattedTextField field1 = new JFormattedTextField(new MaskFormatter("ULLLLLLLLLL"));

コメント