dポイントプレゼントキャンペーン実施中!

JTextField で半角のみ入力可能なチェックを行いたいのですがどうもうまくいきません。
下記のソースは、入力桁数制限チェックと、全角チェックを行っているのですが
半角を入力した後に全角を入力すると、JTextFieldの値が消えてしまいます。
どなたがご指導よろしくお願いします。
もしくは、下記ソースの他によいチェック方法等ありましたら、教えてくださいm(__)m
よろしくお願いいたします。

=======================================
userText.setDocument( new LimitedDocument( 8) );

/**
* 指定文字数・全角チェック
*/
private class LimitedDocument extends PlainDocument {
int limit;
LimitedDocument( int limit ){ this.limit = limit; }

public void insertString( int offset, String str, AttributeSet a ) {
try{

String wholeText = getText( 0, getLength() );
// 文字数チェック
byte[] b = wholeText.getBytes();
if( b.length >= limit ){
return;
}
char c = str.charAt(0);
// 文字が半角だったら挿入する。
if (c < 256 || (c >= 0xff61 && c <= 0xff9f)) {
super.insertString(offset, String.valueOf(c), a);
}
else {
}
}
catch( BadLocationException e ) {
System.out.println( e );
}
}
}

=======================================

A 回答 (3件)

こんばんわ。

こんなのはどうでしょう?

public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null || str.length() == 0)
return;

String strNew = new String();

// 挿入文字数分ループ
char[] strings = str.toCharArray();
for (int i = 0; i < strings.length; i++) {
char ch = strings[i];

// 禁則文字なら挿入しない
if (!isJapanese(ch)) {
ch = changeCharacter(ch);
strNew += String.valueOf(ch);
} else {
continue;
}
}
super.insertString(offs, strNew, a);
}

public static boolean isJapanese(char ch) {
if (((ch < 20) || (ch > 127))
&& ch != '\\'
&& ch != '\t'
&& ch != '\n'
&& ch != '\r'
&& ch != '\f') {
return true;
}
return false;
}
    • good
    • 0

 #1です。



>しかし、やはり、半角入力後に全角を入力すると、
>既存の情報が消えてしまいます・・。

 本当ですね。
 よく確かめもせず、投稿して申し訳ありません。

 いろいろ考えてみた結果、インプットメソッドを無効にすることで、何とかなりそうです。

 メインの方のクラスのソース。

import javax.swing.*;
import java.awt.*;

public class Test extends JFrame {
  JTextField userText;
  
  public Test() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().setLayout(new FlowLayout());
    userText = new JTextField(10);
    userText.setDocument(new LimitedDocument(8));

//JTextFieldのインプットメソッドを無効にする。
//            ↓
    userText.enableInputMethods(false);

    getContentPane().add(userText);
    pack();
  }
  
  public static void main(String args[]) {
    Test frame = new Test();
    frame.setVisible(true);
  }
}

 これで、JTextFieldであるuserTextは、IMEによる日本語入力ができなくなります。
 しかし、クリップボードからのペーストやプログラムからのsetText()に対応するためにはLimitedDocumentはやはり、必要だと思います。
    • good
    • 0

 こんにちは。


 作ってみたら、LimitedDocumentクラスはこんな感じになりました。
 一応、それっぽく動きます。

import javax.swing.text.*;

public class LimitedDocument extends PlainDocument {
  int limit;
  
  public LimitedDocument(int limit) {
    this.limit = limit;
  }
  
  public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
    if (str == null)
      return;
    
    if ((str.length() + getLength()) > limit)
      return;
    
    for (int i = 0; i < str.length(); i++) {
      char c = str.charAt(i);
      if (!(c < 256 || (c >= 0xff61 && c <= 0xff9f)))
        return;
    }

    super.insertString(offs, str, a);
  }
}

(コンパイルするときは全角スペースを半角スペースに変換してからにしてください)
    • good
    • 0
この回答へのお礼

ありがとうございます。ソースまでつけていただき
非常に感謝しております。
しかし、やはり、半角入力後に全角を入力すると、既存の情報が消えてしまいます・・。

お礼日時:2005/02/21 20:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!