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

Jython JTextComponent 2の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!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.getContentPane().add(JScrollPane(txtArea), BorderLayout.CENTER)
         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())