Rubyらしさのための同義語
Javaの命名規則はRubyとは異なります。JRubyは、Javaのメソッド名をRubyの命名規則に従って変換した同義語メソッドを用意することによって、Rubyの人々の便宜を図っています。
setXyz(a)
⇒xyz=(a)
getXyz()
⇒xyz()
abcDefGhi(…)
⇒abc_def_ghi(…)
frame.setVisible(true) ⇒ frame.visible = true
frame.getContentPane ⇒ frame.contentPane
frame.contentPane ⇒ frame.content_pane
下記はそれを利用した例です。
include Java swing = javax.swing JFrame = swing.JFrame frame = JFrame.new("窓の例") label = swing.JLabel.new("こんにちは") frame.content_pane.add(label) frame.default_close_operation = JFrame::EXIT_ON_CLOSE frame.pack frame.visible = true
RubyによるJavaインターフェイスの実装
Rubyのクラス定義でJavaのインターフェイス(の名前のように見えるRubyメソッド呼出しの戻り値)をinclude
し、対応するメソッドを定義することによって、Javaのインターフェイスを実装できます。
include Java swing = javax.swing JFrame = swing.JFrame frame = JFrame.new("窓の例") button = swing.JButton.new("カウンタ") class ButtonAction include java.awt.event.ActionListener def initialize(button) @button = button @count = 0 end def actionPerformed(evt) @count += 1 @button.text = "%03d" % @count end end button.add_action_listener(ButtonAction.new(button)) frame.content_pane.add(button) frame.default_close_operation = JFrame::EXIT_ON_CLOSE frame.pack frame.visible = true
このようなウィンドウが表示されます:
ボタンを1回押すと次のようになります:
ボタンをさらに1回押すとこうなります:
RubyによるJavaクラスの拡張
Javaのクラス(の名前のように見えるRubyメソッド呼出しの戻り値)を基底クラスとしてRubyのクラスを定義すれば、RubyでJavaのクラスを拡張できます。
include Java swing = javax.swing JFrame = swing.JFrame class Button < swing.JButton include java.awt.event.ActionListener def initialize super("000") @count = 0 add_action_listener(self) end def actionPerformed(evt) @count += 1 self.text = "%03d" % @count end end frame = JFrame.new("窓の例") button = Button.new frame.content_pane.add(button) frame.default_close_operation = JFrame::EXIT_ON_CLOSE frame.pack frame.visible = true