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

MyMemoWiki

Jython JTextComponent 2

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

Jython JTextComponent 2

JTextComponent 2 | Jython Swing | Swing | Jython | Python |

http://ryumago.dragon-breath.net/home/program/memo.html

方針

内容

DocumentFilterの利用
  • Document 変更メソッドのフィルタです。DocumentFilter を格納する Document が、insert または remove を介して変更されると、適当なメソッド呼び出しが DocumentFilter に転送されます。
  • 日本語入力中はinsertStringとremoveが交互に走る。入力が確定するとreplaceが走る。
  • コピー&ペースト等での入力でCALLされた場合insertStringが走る。
  • 英数字の入力で入力した場合replaceが走る
  • DeleteやBackSpaceで消す場合はremoveが走る。(ちなみに、消す対象が同じ場合offsetの値もlengthの値も変わらない)

ソースコード

実行例

0750 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())