Created
January 21, 2014 11:00
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @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