2

こんにちは私はアプリを書くためにjrubyを使用していますが、現在、の実装に問題がありDocumentSizeFilterます。現在、私が理解しようとしている2つの問題があります。

  1. super.insertString(または以前に試したsuper.repalce)を呼び出すと、JRubyにないメソッドがトリガーされ続けますが、メソッドは呼び出されています。
  2. また、挿入時に挿入ではなく置換が呼び出されるのはなぜですか?

PS:両方のファイルは

jruby 1.7.1 (1.9.3p327) 2012-12-03 30a153b on OpenJDK 64-Bit Server VM 1.7.0_09-b30 [linux-amd64]

現在使用しているテストファイルは次のとおりです。

#JavaUtilities\DocumentSizeFilter.rb
module JavaUtilities
    class DocumentSizeFilter < DocumentFilter
        def initialize max_char
            super()
            @MAX_CHAR = max_char
        end
        def insertString(fb, offset, string, attrs) 
            puts 'doing insert'
            super.insertString(fb, offset, string, attrs)
        end
        def remove(fb, offset, length) 
            puts 'doing remove'
        end

        def replace(fb,  offset, length, text, attrs) 
            puts 'doing replace'
            super.insertString(fb, offset, text, attrs)
        end
    end
end


    #test.rb
include Java
java_import java.awt.event.WindowEvent;
java_import javax.swing.JButton;
java_import javax.swing.border.Border;
java_import java.awt.Graphics;
java_import javax.swing.JFrame
java_import javax.swing.text.DocumentFilter;
java_import javax.swing.JTextArea;
require 'JavaUtilities/DocumentSizeFilter'
class JFrames < JFrame
    def initialize
        super "HI"
        self.setSize 500,500
        self.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
        self.setLayout nil
        add(area = (JTextArea.new ))
        area.setBounds 30,30,100,40
        area.getDocument.setDocumentFilter(JavaUtilities::DocumentSizeFilter.new 150) 
        self.setVisible true
    end
end

JFrames.new
4

1 に答える 1

1

あなたの混乱はsuperRubyにあるものです:それは参照ではなく、キーワードです。

あなたがする必要があるのはsuper、 を呼び出すことだけです。

def replace(fb,  offset, length, text, attrs) 
  puts 'doing replace'
  super
end

superwith no args は、現在のメソッドの引数を使用してスーパークラス メソッドを呼び出します。のように引数を指定して呼び出すことも、 のように引数super foo, barなし (明示的に括弧が必要) で呼び出すこともできますsuper()

于 2013-01-03T02:32:43.800 に答える