« ◇実行可能jarをWindowsバッチで作る | トップページ | ◇NW-A40とWI-1000Xとポッチとマジックテープ »

JTextPaneで変更結果イベントを拾う

備忘録
いまさらSwingでもなかろうとはいえ、作り上げてきたシステムがあるので。

 JTextPaneの変更されたというイベントは拾えない

JTextAreaはDocumentLisnerをimplementし次のような形でセットすればテキストが変更されたイベントを拾うことができます。

class MyDocumentListemer implements DocumentListener {
   void printEvent(DocumentEvent e) {
      Document d=e.getDocument();
      try{
         System.out.println(d.getText(0,d.getLength()));
         }
      catch(Exception ex){}
      }
   public void insertUpdate (DocumentEvent e){printEvent(e);}
   public void removeUpdate (DocumentEvent e){printEvent(e);}
   public void changedUpdate(DocumentEvent e){printEvent(e);}
   }
//...
   JTextArea tarea;
   //...
   tarea.getDocument().addDocumentListener(new MyDocumentListemer());

しかしJTextPaneではこの方法ではイベントは通知されません。
次の様にStyledDocumentを使ってもイベントは通知されません。

   // この方法では通知されない
   JTextPane tpain;
   //..
   DefaultStyledDocument style = new DefaultStyledDocument()
   style.addDocumentListener(new MyDocumentListemer());
   tpain.setStyledDocument(_style);

DocumentFilterを使う方法もあくまで変更中のイベントであり、変更されたイベントは拾えません。

 変更中のイベントを拾い、invokeLaterで変更後に通知を受ける

次のようにして変更中のイベントをKeyListenerで拾いSwingUtilities.invokeLaterで変更完了後に動作するようにしました。

class MyTextPainChangeListener implements KeyListener{
   public void  keyPressed(KeyEvent e){}
   public void  keyReleased(KeyEvent e){}
   public void  keyTyped(KeyEvent e){
      final JTextPane tp=(JTextPane)(e.getSource());
      SwingUtilities.invokeLater(new Runnable(){
         public void run(){ // 変更完了後、ディスパッチスレッドで呼ばれる
            System.out.println(tp.getText());
            }
         });
      }
   }
//...
   JTextPane tpain;
   //...
   tpain.addKeyListener(new MyTextPainChangeListener());

|

« ◇実行可能jarをWindowsバッチで作る | トップページ | ◇NW-A40とWI-1000Xとポッチとマジックテープ »

トラックバック


この記事へのトラックバック一覧です: JTextPaneで変更結果イベントを拾う:

« ◇実行可能jarをWindowsバッチで作る | トップページ | ◇NW-A40とWI-1000Xとポッチとマジックテープ »