Skip to content

Instantly share code, notes, and snippets.

@kares
Created January 21, 2014 11:00
Show Gist options
  • Save kares/8538048 to your computer and use it in GitHub Desktop.
Save kares/8538048 to your computer and use it in GitHub Desktop.
How to translate the use of Java (Swing) internal classes in JRuby code http://stackoverflow.com/questions/21245604/how-to-translate-the-use-of-java-internal-classes-in-jruby-code
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
java_import java.awt.Cursor
SQUARELENGTH = 10; MAXNSQUARES = 100;
def initialize
super
@squares = []; @size = 0; @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 = @current)
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| draw_square(graphics, square) }
end
include java.awt.event.MouseListener
[ 'mouseEntered', 'mouseExited', 'mouseReleased' ].each do |method|
class_eval "def #{method}(evt); end"
end
def mousePressed(evt)
x = evt.getX; y = evt.getY
add(x, y) unless find_square(x, y)
end
def mouseClicked(evt)
remove if evt.click_count >= 2
end
include java.awt.event.MouseMotionListener
def mouseMoved(evt)
if find_square(evt.getX, evt.getY)
setCursor Cursor.getPredefinedCursor(Cursor::CROSSHAIR_CURSOR)
else
setCursor Cursor.getDefaultCursor()
end
end
def mouseDragged(evt)
return unless @current
graphics = self.graphics
graphics.setXORMode background
square = @squares[ @current ]
draw_square(graphics, square)
square.x = evt.getX
square.y = evt.getY
draw_square(graphics, square)
graphics.dispose
end
private
def draw_square(graphics, square)
graphics.drawRect(
square.x - SQUARELENGTH / 2,
square.y - SQUARELENGTH / 2,
SQUARELENGTH, SQUARELENGTH
)
end
def find_square(x, y)
@squares.each do |square|
if (square.x - SQUARELENGTH / 2 <= x &&
x <= square.x + SQUARELENGTH / 2 &&
square.y - SQUARELENGTH / 2 <= y &&
y <= square.y + SQUARELENGTH / 2)
return square
end
end
nil
end
end
frame.content_pane.add MousePanel.new
frame.show
/**
* @version 1.20 25 Mar 1998
* @author Cay Horstmann
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MousePanel extends JPanel implements MouseMotionListener {
public MousePanel() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();
current = find(x, y);
if (current < 0) // not inside a square
{
add(x, y);
}
}
public void mouseClicked(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();
if (evt.getClickCount() >= 2) {
remove(current);
}
}
});
addMouseMotionListener(this);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < nsquares; i++) {
draw(g, i);
}
}
public int find(int x, int y) {
for (int i = 0; i < nsquares; i++) {
if (squares[i].x - SQUARELENGTH / 2 <= x
&& x <= squares[i].x + SQUARELENGTH / 2
&& squares[i].y - SQUARELENGTH / 2 <= y
&& y <= squares[i].y + SQUARELENGTH / 2) {
return i;
}
}
return -1;
}
public void draw(Graphics g, int i) {
g.drawRect(squares[i].x - SQUARELENGTH / 2,
squares[i].y - SQUARELENGTH / 2,
SQUARELENGTH,
SQUARELENGTH);
}
public void add(int x, int y) {
if (nsquares < MAXNSQUARES) {
squares[nsquares] = new Point(x, y);
current = nsquares;
nsquares++;
repaint();
}
}
public void remove(int n) {
if (n < 0 || n >= nsquares) {
return;
}
nsquares--;
squares[n] = squares[nsquares];
if (current == n) {
current = -1;
}
repaint();
}
public void mouseMoved(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();
if (find(x, y) >= 0) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
} else {
setCursor(Cursor.getDefaultCursor());
}
}
public void mouseDragged(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();
if (current >= 0) {
Graphics g = getGraphics();
g.setXORMode(getBackground());
draw(g, current);
squares[current].x = x;
squares[current].y = y;
draw(g, current);
g.dispose();
}
}
private static final int SQUARELENGTH = 10;
private static final int MAXNSQUARES = 100;
private Point[] squares = new Point[MAXNSQUARES];
private int nsquares = 0;
private int current = -1;
}
class MouseFrame extends JFrame {
public MouseFrame() {
setTitle("MouseTest");
setSize(300, 200);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Container contentPane = getContentPane();
contentPane.add(new MousePanel());
}
}
public class MouseTest {
public static void main(String[] args) {
JFrame frame = new MouseFrame();
frame.show();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment