Написание фильтра документов - super.insertString не найден

Здравствуйте, я использую jruby для написания приложения, и в настоящее время у меня проблемы с реализацией DocumentSizeFilter. Сейчас я пытаюсь решить две проблемы.

  1. Вызов super.insertString (или super.repalce, который я пробовал ранее) продолжает запускать метод, не найденный в JRuby, хотя этот метод вызывается.
  2. Также почему при вставке вызывается замена, а не вставка?

P.S: Оба файла создаются с использованием

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

person foklepoint    schedule 03.01.2013    source источник


Ответы (1)


Ваше замешательство заключается в том, что такое super в Ruby: это не ссылка, это ключевое слово.

Все, что вам нужно сделать, это позвонить super, например:

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

super без аргументов вызывает метод суперкласса с аргументами текущего метода. Вы можете вызывать с аргументами, например, super foo, bar, или без аргументов (явно требуются скобки), например, super().

person Dave Newton    schedule 03.01.2013