トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

Jython JTextComponent 2



目次



記事一覧

キーワード

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の値も変わらない)

 ソースコード

実行例
ソースコード
# -*- 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())



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.