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