• ベストアンサー

(Swing)JTextFieldを半角のみ入力可能にする方法

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 ); } } } =======================================

質問者が選んだベストアンサー

  • ベストアンサー
  • maical
  • ベストアンサー率83% (5/6)
回答No.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; }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 #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はやはり、必要だと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  作ってみたら、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);   } } (コンパイルするときは全角スペースを半角スペースに変換してからにしてください)

funamin
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBScriptである文字列に半角文字が含まれているかどうか調べる方法について

    VBScriptである文字列に半角文字が含まれているかどうか調べる方法について、ネットで調べてソースコードを拾ってきたのですが... IFの条件でなぜ全角、半角が判断できるか分かりません。教えてください。お願いします。 iLen = Len(str1) iLenByte = 0 '--- 文字列のバイト数 For i = 2 To iLen strField = Mid(str1, i, 1) iCode = Asc(strField) If iCode > 0 Then '--- 半角文字 Else '--- 全角文字 End If Next

  • 半角カタカナの入力チェックを作りたいです

    入力フォームで入力された文字に対して半角カタカナかチェックをしたいです。 function CheckHalfSizeKatakana($str) {  if (mb_ereg("^[ア-ン゛゜]+$",$str)) {    return true;  } else {    return false;  } } としたのですがうまくいきません。 PHP4です。

    • ベストアンサー
    • PHP
  • フォームで半角文字の入力のみ許可する方法について

    Javascriptの初心者です。フォームのtext入力で半角文字だけを入力できるようにしたいのですが、webから入手したサンプルソースで理解できない部分があります。以下のソース(抜粋)で、"%nFF"と"0xFF60"とは何を示しているのでしょうか。尚、変数doreに入っているのはescape()された値です。 if(dore.indexOf("%uFF") != -1 && '0x' + dore.substring(2 , dore.length) < 0xFF60)kekka++; else if(data[i].match(/\W/g) != null && dore.length == 6)kekka++;

  • CString型 全角半角を意識せずに「1文字」ずつ取り出す

    CString型の文字列に格納されている文字を1文字ずつ取り出したいです。 ただし半角なら1バイト単位で、全角なら2バイト単位で、という風に分離したいです。 半角だけなら、str[0] str[1]...という風に取り出せますが、 全角が混じっていると、1バイト目、2バイト目と分離されてしまいます。 その文字が半角か全角かを判断して、半角なら1バイト、全角なら2バイト同時に取り出すロジックを、下記のような感じの関数として作りたいです。 CString ripString(CString str,int index){ //ソースとなる文字列、n文字目 /*~処理~*/ return 文字列; } たとえば"あaいbうcえdおe"という文字列を入れると、 CString str="あaいbうcえdおe"; ripString(str,0) →結果 "あ" ripString(str,1) →結果 "a" ripString(str,2) →結果 "い" ripString(str,3) →結果 "b"  ・  ・  ・   こういうことをするのに良い方法はありますか? 1バイトごとのそれぞれの文字自身が、 ・半角文字なのか ・全角文字の前1バイトなのか ・全角文字の後1バイトなのか これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。

  • 全角の英数字と記号を半角に変換する方法について

    フォームに電話番号や郵便番号を入力する時に、 強制的に「"ime-mode: disabled;"」で半角入力するようにし、 カスタム関数「 chkCode(id)」を使いメモ帳などからコピー&貼付けをした時に、 全角の英数字が自動で半角の英数字に変換されるにしました。 いろいろと調べてみたのですが、記号を全角から半角に変換する方法が分かりません。 ゴールまであともう少しのところまでなのですが、 アドバイスを頂ければ幸いです。 よろしお願いいたします。 【スクリプト】 <!--半角変換ー--> function chkCode(id) { work=''; for (lp=0;lp<id.value.length;lp++) { unicode=id.value.charCodeAt(lp); if ((0xff0f<unicode) && (unicode<0xff1a)) { work+=String.fromCharCode(unicode-0xfee0); } else if ((0xff20<unicode) && (unicode<0xff3b)) { work+=String.fromCharCode(unicode-0xfee0); } else if ((0xff40<unicode) && (unicode<0xff5b)) { work+=String.fromCharCode(unicode-0xfee0); } else { work+=String.fromCharCode(unicode); } } id.value=work; } 【フォーム】 <input type="text" name="text01" value="連絡先" size="60" style="width:300px;" "ime-mode: disabled;" onkeyup="chkCode(this);" onfocus="if (this.value == defaultValue) this.value = '';" onblur="if (!this.value) this.value = defaultValue;">

  • 全角文字と半角文字を判別して文字列を追加

    全角文字と半角文字が混合している文字列に文字を追加するプログラムを考えています。 仕様としては全角から半角に変わる際には全角文字の後ろに1234を、 半角から全角に変わるときは半角文字の後ろに4321をつけるというものです。 例1 文字列が「あxxxお」ならば出力結果は「あ1234xxx4321お」 そこで質問なのですが 文字列から全角文字と半角文字をプログラム上で判別して 上記のように出力するにはどうしたらいいんでしょうか? ヒント等ございましたらどうぞお願いします。 とりあえず作ってみた例1の結果を無理やり出力するプログラムのコードを載せておきます。 こちらをうまく改変してくださっても結構ですのでよろしくお願いいたします。 #include <stdio.h> #include <string.h> int main(void){ unsigned char str0[256] = "あxxxお", str1[256] = "1234",str2[256]= "4321"; unsigned int zh,hz, len0 = strlen(str0),len1=strlen(str1),len2=strlen(str2); printf("挿入前:%s\n",&str0); zh=2; //全角から半角に変わる位置 hz=5; //半角から全角に変わる位置 //1234を挿入/// memmove(&str0[zh+len1], &str0[zh], len0 - zh+1); memcpy(&str0[zh], str1, len1); //4321を挿入/// memmove(&str0[hz+len1+len2], &str0[hz+len1], len0); memcpy(&str0[hz+len1], str2, len2); printf("挿入後:%s\n",&str0); return 0; }

  • IFステートメントで半角でも全角でもtrueとさせ

    IFステートメントで半角でも全角でもtrueとさせるには? Sub test1() Dim str As String str = "ABC"’←全角のA If str Like "*A*" Then ’←半角のA MsgBox "Aがあります" End If End Sub これで、半角Aもメッセージを表示させたいのですが、 マッチバイトみたいなのってありますか?

  • 半角の入力

    半角文字を入力するとき、全角半角キーで切り替えているのですが、全角で入力して変換する方法もあると思います。どういう方法で入力するのが正しいというか、推奨というか、便利というかお教えください。

  • 文字列に半角・全角スペースが入っているかをチェックする関数のおかしな結

    文字列に半角・全角スペースが入っているかをチェックする関数のおかしな結果? 下記コードのように「文字列に半角・全角スペースが入っているかをチェックする関数」を作りました。 $textに入る文字列に半角・全角のスペースが入っているかをチェックします。 -------------------------------------------- my $text = "東 京"; if( isSpace($text) ) {   print "スペースあり"; } else {   print "スペースなし"; } sub isSpace{   my $str = shift || return(undef);   if( $str =~ /.*[\s ]+.*/ ){     return(1);   }else{     return(0);   } } -------------------------------------------- しかしなぜか1行目を my $text = "メ"; とするとスペースが入っているという結果になってしまいます。 なぜ「メ」が入ると半角もしくは全角のスペースとみなされてしまうのでしょうか? また、どうすれば正しくチェックできるようになりますか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • 半角カナから全角カナへ

    お世話になります。 今、フォームから入力された半角カナを全角カナへ変換しようとしているのですが、どうしてもうまく行きません。 処理は以下のようにしています。 jcode::convert(\$str, 'euc'); if($str =~ /[\xA1-\xDF]/){ jcode::h2z_euc(\$str); } (1)まず、半角カナが含まれているかのチェックで[\xA1-\xDF]を使用していますが色々調べたところ、実際は (?:\x8E[\xA6-\xDF]) が正しいようなのですが、この場合文字数が少ないとひっかかってくれません。例えば半角のア1文字や2文字など。また、文字数が多くても半角英数と半角カナが混在しているとひっかからない場合もあります。 上記の式だとひっかかってくれますが、この判定で構わないのでしょうか。 (2)上記の式できちんと置換されるものとされないで漢字のように文字化けするものと出てきてしまいます。 例えば「インターフェース」などという半角は全滅です。 「バージョン」などは大丈夫でした。 間違いなど教えて頂ければと思います。 宜しくお願い致します。

    • ベストアンサー
    • Perl