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());
| 固定リンク