import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BufferedDraw extends JPanel implements MouseListener,
MouseMotionListener {
Rectangle rect = new Rectangle(0, 0, 100, 50);
BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);
Graphics2D big;
int last_x, last_y;
boolean firstTime = true;
Rectangle area;
boolean pressOut = false;
public BufferedDraw() {
setBackground(Color.white);
addMouseMotionListener(this);
addMouseListener(this);
}
// Handles the event of the user pressing down the mouse button.
public void mousePressed(MouseEvent e) {
last_x = rect.x - e.getX();
last_y = rect.y - e.getY();
// Checks whether or not the cursor is inside of the rectangle while the
// user is pressing themouse.
if (rect.contains(e.getX(), e.getY())) {
updateLocation(e);
} else {
pressOut = true;
}
}
// Handles the event of a user dragging the mouse while holding down the
// mouse button.
public void mouseDragged(MouseEvent e) {
if (!pressOut) {
updateLocation(e);
}
}
// Handles the event of a user releasing the mouse button.
public void mouseReleased(MouseEvent e) {
if (rect.contains(e.getX(), e.getY())) {
updateLocation(e);
}
}
public void mouseMoved(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void updateLocation(MouseEvent e) {
rect.setLocation(last_x + e.getX(), last_y + e.getY());
repaint();
}
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (firstTime) {
Dimension dim = getSize();
int w = dim.width;
int h = dim.height;
area = new Rectangle(dim);
bi = (BufferedImage) createImage(w, h);
big = bi.createGraphics();
rect.setLocation(w / 2 - 50, h / 2 - 25);
big.setStroke(new BasicStroke(8.0f));
firstTime = false;
}
big.setColor(Color.white);
big.clearRect(0, 0, area.width, area.height);
big.setPaint(Color.red);
big.draw(rect);
big.setPaint(Color.blue);
big.fill(rect);
g2.drawImage(bi, 0, 0, this);
}
private boolean checkRect() {
if (area == null) {
return false;
}
if (area.contains(rect.x, rect.y, 100, 50)) {
return true;
}
int new_x = rect.x;
int new_y = rect.y;
if ((rect.x + 100) > area.width) {
new_x = area.width - 99;
}
if (rect.x < 0) {
new_x = -1;
}
if ((rect.y + 50) > area.height) {
new_y = area.height - 49;
}
if (rect.y < 0) {
new_y = -1;
}
rect.setLocation(new_x, new_y);
return false;
}
public static void main(String s[]) {
JFrame f = new JFrame("BufferedShapeMover");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(new BufferedDraw(), "Center");
f.pack();
f.setSize(new Dimension(550, 250));
f.show();
}
} |