!!!Jython JTextComponent 2 [JTextComponent 2][Jython Swing][Swing][Jython][Python] http://ryumago.dragon-breath.net/home/program/memo.html !!方針 * 半ば強引に、[[Swingで作成したサンプル|JTextComponent 2]]を Jythonに書き換えてみる。 !!内容 ::DocumentFilterの利用 *Document 変更メソッドのフィルタです。DocumentFilter を格納する Document が、insert または remove を介して変更されると、適当なメソッド呼び出しが DocumentFilter に転送されます。 *日本語入力中はinsertStringとremoveが交互に走る。入力が確定するとreplaceが走る。 *コピー&ペースト等での入力でCALLされた場合insertStringが走る。 *英数字の入力で入力した場合replaceが走る *DeleteやBackSpaceで消す場合はremoveが走る。(ちなみに、消す対象が同じ場合offsetの値もlengthの値も変わらない) !!ソースコード ::実行例 {{ref_image js_jtext2.jpg}} ::ソースコード # -*- coding: utf-8 -*- from java.lang import * from java.awt import BorderLayout from javax.swing import JFrame from javax.swing import JScrollPane from javax.swing import JTextArea from javax.swing import SwingUtilities from javax.swing.text import AbstractDocument from javax.swing.text import AttributeSet from javax.swing.text import BadLocationException from javax.swing.text import Document from javax.swing.text import DocumentFilter class JTextTest2(object): def createUI(self): self.frame = JFrame("TextTest2") self.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); txtArea = JTextArea(10, 30) # Documentを取得し、DocumentFilterをセット doc = txtArea.document doc.documentFilter = EchoDocumentFilter() self.frame.contentPane.add(JScrollPane(txtArea), BorderLayout.CENTER) self.frame.pack(); self.frame.visible = True; class EchoDocumentFilter(DocumentFilter): def insertString(self, fb, offset, string, attr): print "insertString : %s" % string fb.insertString(offset, string, attr) def remove(self, fb, offset, length): print "remove" fb.remove(offset, length) def replace(self, fb, offset, length, text, attrs): print "replace : %s" % text fb.replace(offset, length, text + text, attrs) class Invoker(Runnable): def run(self): jtt = JTextTest2() jtt.createUI() SwingUtilities.invokeLater(Invoker())