我正在尝试使用Java来处理JRuby :这里和那里的例子都是,我试图将它们从纯Java转换为JRuby。这很好,特别是在阅读了优秀站点齐特码中专门针对Jruby的部分之后。
然而,有些事情我仍然不知道如何翻译。
例如,选择这是霍斯特曼书中的java代码,如何正确地将其转换为JRuby?在这段代码中(在Jpanel构造函数中),我们依赖于MouseAdapter的内部类。其余的都很简单。
如何翻译这样的内部类(或更充分的“匿名”类)?
发布于 2014-01-21 09:49:45
只需重构/调整零件来为你工作。
frame = javax.swing.JFrame.new
frame.title = "MouseTest"
frame.set_size(300, 200)
frame.add_window_listener do |evt|
if evt.getID == java.awt.event.WindowEvent::WINDOW_CLOSING
java.lang.System.exit(0)
end
end
class MousePanel < Java::JavaxSwing::JPanel
SQUARELENGTH = 10; MAXNSQUARES = 100;
def initialize
super
@squares = []; @current = nil
add_mouse_listener self
add_mouse_motion_listener self
end
def add(x, y)
if @squares.size < MAXNSQUARES
@current = @squares.size
@squares << Point.new(x, y)
repaint
end
end
def remove(n)
return if (n < 0 || n >= @squares.size)
@squares.pop
@squares[n] = @squares[@squares.size];
@current = nil if @current == n
repaint
end
def paintComponent(graphics)
super
@squares.each { |square| do_draw(graphics, square) }
end
def do_draw(graphics, square)
graphics.drawRect(
square.x - SQUARELENGTH / 2,
square.y - SQUARELENGTH / 2,
SQUARELENGTH, SQUARELENGTH
)
end
private :do_draw
include java.awt.event.MouseListener
[ 'mouseEntered', 'mouseExited', 'mouseReleased' ].each do |method|
class_eval "def #{method}(evt); end"
end
def mousePressed(evt)
puts "mousePressed #{evt}"
end
def mouseClicked(evt)
puts "mouseClicked #{evt}"
end
include java.awt.event.MouseMotionListener
def mouseMoved(evt)
puts "mouseMoved #{evt}"
end
def mouseDragged(evt)
puts "mouseDragged #{evt}"
end
end
frame.content_pane.add MousePanel.new
frame.show注意到所有更新的*add_xxx_listener事件..。
将其放入可读/可分(包括原始代码)的要点中:https://gist.github.com/kares/8538048
https://stackoverflow.com/questions/21245604
复制相似问题