はじめての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なのかを取得できるかわかりませんでした。
サンプルコードは次の本を参考にしました。