- ベストアンサー
DocumentListenerについてのエラー
- 以下のソースのinsertUpdateメソッド内のsetText()でエラーが発生しています。
- actionPerformedの場合はエラーが発生しません。
- 詳細な情報を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 あー、なるほど、Documentイベントでは、イベント元のDocumentを変更できないようにロックがかかっているんですね。 知りませんでした。 どうしてそうなっているかというと、登録してある DocumentListener は、一つとは限りません。 また、DocumentEvent に反応するのは、JTextField 自信も、内容の描画のために反応するはずです。 そのように複数の DocumentListener があるのに、最初に呼び出された DocumentListener が、Document の内容を変更してしまうと、後から呼び出される DocumentListener に正しい内容が伝えられなくなってしまいます。 だから、すべての DocumentListener が呼び出され、イベントが完全に消化されるまで、Document の内容にロックがかかっているようですね。 最初に思いつく回避策は、SwingUtilities.invokeLater()メソッド使って、変更部分だけを、イベントが終わった後から実行してもらうって事ですかねぇ。 public void insertUpdate(DocumentEvent de) { name = a.getText(); name = name.replaceAll("/", "_"); name = name.replaceAll(":", "_"); System.out.println("name==" + name); //クリップボードにコピー Toolkit.getDefaultToolkit().getSystemClipboard().setContents( new StringSelection(name), null); //テキストを消すところだけは後からにしてもらう SwingUtilities.invokeLater(new Runnable() { public void run() { a.setText(""); } }); } それにしても、この JTextField って、クリップボードの操作のためだけにありますよねぇ。 ちょっと、設計がトリッキーじゃないですか? 最初から、クリップボードを操作した方がすっきりすると思いますが。 1.ボタンを用意し、そのボタンが押されると、 2.クリップボードから文字を読み込む。 3.文字列置換。 4.結果をクリップボードに戻す。 どうでしょう。
お礼
いつもありがとうございます。 クリップボードにコピーの部分はとても勉強になりました。 また、この設計は以下の目的です。 1. webメール上の時刻をコピーする。 2. /と:を取り除く。 3. メール文をファイル名を日付にして、テキストとして保存する。 これを効率よく作業する目的で設計しました。 おかげさまで完成しました。 本当にありがとうございますた。