トップ 一覧 ping 検索 ヘルプ RSS ログイン

JTextComponent 2の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!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);
     }
   }
 }