| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「JTextComponent 2」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==JTextComponent 2== [Jython JTextComponent 2][Jython Swing][Swing][Jython][Python] ===内容=== =====DocumentFilterの利用===== Document 変更メソッドのフ…」)
 
1行目: 1行目:
 
==JTextComponent 2==
 
==JTextComponent 2==
[Jython JTextComponent 2][Jython Swing][Swing][Jython][Python]
+
[[Jython JTextComponent 2][Jython Swing][Swing][Jython][Python]]
  
 
===内容===
 
===内容===

2020年2月15日 (土) 08:04時点における版

JTextComponent 2

[[Jython JTextComponent 2][Jython Swing][Swing][Jython][Python]]

内容

DocumentFilterの利用

Document 変更メソッドのフィルタです。DocumentFilter を格納する Document が、insert または remove を介して変更されると、適当なメソッド呼び出しが DocumentFilter に転送されます。

ソースコード

実行例

0741 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);
    }
  }
}