はじめてのswing on jruby その参
今回は、お絵描きを作ってみます。
まず、javaのコード
import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; public class SimplePaint extends JFrame { int x0 = 0; int y0 = 0; JPanel panel; public static void main ( String[] args ) { SimplePaint w = new SimplePaint("SimplePaint"); w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); w.setSize(350,250); w.setVisible(true); } public SimplePaint(String title){ super(title); panel = (JPanel)getContentPane(); panel.addMouseListener(new MouseCheck()); panel.addMouseMotionListener(new MouseCheck()); } class MouseCheck extends MouseInputAdapter{ public void mousePressed ( MouseEvent e){ x0=e.getX(); y0=e.getY(); } public void mouseDragged(MouseEvent e){ Graphics g = panel.getGraphics(); int x=e.getX(); int y=e.getY(); g.drawLine(x0,y0,x,y); x0=x; y0=y; } } }
JRubyで書くと、
#!/usr/bin/env jruby require 'java' import javax.swing.JFrame import javax.swing.JPanel import javax.swing.event.MouseInputAdapter class SimplePaint < JFrame def initialize(title) super title @panel=self.content_pane @panel.add_mouse_listener(MouseCheck.new) @panel.add_mouse_motion_listener(MouseCheck.new) end class MouseCheck < MouseInputAdapter @@x0=0 @@y0=0 def mousePressed(e) @@x0=e.get_x @@y0=e.get_y end def mouseDragged(e) g=e.source.graphics x=e.get_x y=e.get_y g.draw_line(@@x0,@@y0,x,y) @@x0=x @@y0=y end end end frame=SimplePaint.new("SimplePaint") frame.default_close_operation=(JFrame::EXIT_ON_CLOSE) frame.set_size(350,250) frame.visible=true
キモは、MouseCheckクラスの変数をクラス変数で持つこと。
イベントが発生するたびに毎回newされるらしい。
インスタンス変数に入れられません。
最初インスタンス変数に入れてしまって、毎回nilになるという現象に
悩んでしまいました。
大場さんがActionListenerをブロックで渡す方法を教えてくれたけど、
イベントを分ける時はどうするんだろ。
どうやったらPRESSEDだとかCLICKEDなのかを取得できるかわかりませんでした。
サンプルコードは次の本を参考にしました。