• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DocumentListenerについて)

DocumentListenerについてのエラー

このQ&Aのポイント
  • 以下のソースのinsertUpdateメソッド内のsetText()でエラーが発生しています。
  • actionPerformedの場合はエラーが発生しません。
  • 詳細な情報を教えてください。

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.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.結果をクリップボードに戻す。  どうでしょう。

hatokamome
質問者

お礼

いつもありがとうございます。 クリップボードにコピーの部分はとても勉強になりました。 また、この設計は以下の目的です。 1. webメール上の時刻をコピーする。 2. /と:を取り除く。 3. メール文をファイル名を日付にして、テキストとして保存する。 これを効率よく作業する目的で設計しました。 おかげさまで完成しました。 本当にありがとうございますた。

関連するQ&A