- PR -

"java.awt.TextArea"の入力制限は可能でしょうか?

1
投稿者投稿内容
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-11-27 11:39
"java.awt.TextArea"の入力制限を行いたいのですが、可能なのでしょうか?

TextAreaのコンストラクトを行う時に下記のように行数と列数を指定しているのですが
指定した行、列数以上の入力ができてしまいます。
 TextArea textArea1 = new TextArea("", 3, 3);

API仕様を見るとTextAreaのコンストラクトの説明に
"指定された行数と列数と空のテキスト文字列を持つ新しいテキスト領域を構築"
と書かれています。
これは行、列数を指定して入力を制限する意味ではないのでしょうか?

また、入力を制限するにはどのようにしたら良いのでしょうか?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-11-27 13:31
引用:

API仕様を見るとTextAreaのコンストラクトの説明に
"指定された行数と列数と空のテキスト文字列を持つ新しいテキスト領域を構築"
と書かれています。
これは行、列数を指定して入力を制限する意味ではないのでしょうか?


TextAreaのソースコードを追いかけて見れば分かりますが、コンストラクタで指定した行と列は、表示の際の最適サイズなどののサイズ計算にのみ使用されています。
したがって、APIリファレンスが言いたいことは、
"指定された行数と列数分が表示されるテキスト領域を構築"
であり、制限されるわけではありません。
#こんな、抽象的な紛らわしい説明しないでほしいわ

引用:

入力を制限するにはどのようにしたら良いのでしょうか?


入力の何を制限したいのでしょうか?文字数?入力文字?

どちらにせよ、テキストコンポーネントの内部状態が変更される前にチェックする必要があります。
したがって、TextListenerではなくTextAreaの派生クラスを作成し、insert()メソッドをオーバーライドして、希望の処理を追加してあげればよいでしょう。このとき親クラスのTextAreaのinsertを呼び忘れないよう注意してください。

また、ASCII文字しか入力しないのであればKeyListenerで監視するというのも可能かもしれません。

#追加
大嘘でした。insert()なんて呼ばれてません。J2SE 1.4.2では、KeybordFocusManager#dispatchKeyEvent()内でpeerに対して直接、処理していました。
どのバージョンを使用しているのかは分からないですが、1.4系の場合、KeybordFocusManager#dispatchKeyEvent()をオーバーライドし、置き換える必要があると思います。



[ メッセージ編集済み 編集者: かずくん 編集日時 2003-11-27 14:31 ]
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-11-27 14:30
かずくんさん、ありがとうございました。

>表示の際の最適サイズなどののサイズ計算にのみ使用されています。
まったくの勘違いでしたね・・・

>入力の何を制限したいのでしょうか?文字数?入力文字?
指定した行以上の入力を出来ないようにしたいのです。
つまり改行2回までとしたいのです。

もっと簡単に出来ると安易に考えていました・・・
なんかややこしそうですね
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-11-27 14:47
引用:

指定した行以上の入力を出来ないようにしたいのです。
つまり改行2回までとしたいのです。


これだけだったら、KeyListenerで改行コードの入力を監視し、2回以上の改行のときは、KeyEvent#consume()で入力を阻止すればいいのでは?
TextArea#getText()には改行コード含まれているし。
1

スキルアップ/キャリアアップ(JOB@IT)