!!!JTextComponent 2 [Jython JTextComponent 2][Jython Swing][Swing][Jython][Python] !!内容 ::DocumentFilterの利用 Document 変更メソッドのフィルタです。DocumentFilter を格納する Document が、insert または remove を介して変更されると、適当なメソッド呼び出しが DocumentFilter に転送されます。 !!ソースコード ::実行例 {{ref_image jtext2.jpg}} ::ソースコード import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.DocumentFilter; /** * @see http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html#commands */ public class JTextTest2 { private JFrame frame; private void createUI() { frame = new JFrame("TextTest2"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextArea txtArea = new JTextArea(10, 30); // Documentを取得し、DocumentFilterをセット // 一旦、AbstractDocumentにキャストする必要あり Document doc = txtArea.getDocument(); ((AbstractDocument)doc).setDocumentFilter(new EchoDocumentFilter()); frame.getContentPane().add(new JScrollPane(txtArea), BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater( new Runnable(){ public void run() { JTextTest2 jft = new JTextTest2(); jft.createUI(); } } ); } /** * 日本語入力中はinsertStringとremoveが交互に走る。入力が確定するとreplaceが走る。 * コピー&ペースト等での入力でCALLされた場合insertStringが走る。 * 英数字の入力で入力した場合replaceが走る * DeleteやBackSpaceで消す場合はremoveが走る。(ちなみに、消す対象が同じ場合offsetの値もlengthの値も変わらない) * @see http://ryumago.dragon-breath.net/home/program/memo.html */ class EchoDocumentFilter extends DocumentFilter { @Override public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { System.out.println("insertString : " + string); fb.insertString(offset, string, attr); } @Override public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { System.out.println("remove"); fb.remove(offset, length); } @Override public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { System.out.println("replace : " + text); fb.replace(offset, length, text + text, attrs); } } }