I have a program which draws 2 rectangles in a JFrame
. I would like that when I drag and move (for resize), one of the rectangles, the second one move simultaneously. So, when you move the inferior border of the rectangle above, the superior border of the rectangle below moves in the same direction.
Edit: I am a beginner in Java programming, and I do not see at all how to do this.
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
class Resizing extends JPanel {
Rectangle rect = new Rectangle(100,100,150,150);
Rectangle rect2 = new Rectangle(100,250,150,100);
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(new Color(0, 0, 200));
g2.fill(rect);
g2.setColor(new Color(0, 0, 100));
g2.fill(rect2);
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Resizing test = new Resizing();
Resizing test2 = new Resizing();
Resizer resizer = new Resizer(test);
Resizer2 resizer2 = new Resizer2(test2);
test.addMouseListener(resizer);
test2.addMouseListener(resizer2);
test.addMouseMotionListener(resizer);
test2.addMouseMotionListener(resizer2);
f.add(test);
f.add(test2);
f.setSize(400,400);
f.setLocation(100,100);
f.setVisible(true);
}
}
class Resizer extends MouseAdapter {
Resizing component;
boolean dragging = false;
// Give user some leeway for selections.
final int PROX_DIST = 3;
public Resizer(Resizing r) {
component = r;
}
public void mousePressed(MouseEvent e) {
if(component.getCursor() != Cursor.getDefaultCursor()) {
// If cursor is set for resizing, allow dragging.
dragging = true;
}
}
public void mouseReleased(MouseEvent e) {
dragging = false;
}
public void mouseDragged(MouseEvent e) {
if(dragging){
Point p = e.getPoint();
Rectangle r = component.rect;
int type = component.getCursor().getType();
int dx = p.x - r.x;
int dy = p.y - r.y;
switch(type) {
case Cursor.N_RESIZE_CURSOR:
int height = r.height - dy;
r.setRect(r.x, r.y+dy, r.width, height);
break;
case Cursor.S_RESIZE_CURSOR:
height = dy;
r.setRect(r.x, r.y, r.width, height);
break;
default:
System.out.println("unexpected type: " + type);
}
component.repaint();
}
}
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
if(!isOverRect(p)) {
if(component.getCursor() != Cursor.getDefaultCursor()) {
// If cursor is not over rect reset it to the default.
component.setCursor(Cursor.getDefaultCursor());
}
return;
}
// Locate cursor relative to center of rect.
int outcode = getOutcode(p);
Rectangle r = component.rect;
switch(outcode) {
case Rectangle.OUT_TOP:
if(Math.abs(p.y - r.y) < PROX_DIST) {
component.setCursor(Cursor.getPredefinedCursor(
Cursor.N_RESIZE_CURSOR));
}
break;
case Rectangle.OUT_BOTTOM:
if(Math.abs(p.y - (r.y+r.height)) < PROX_DIST) {
component.setCursor(Cursor.getPredefinedCursor(
Cursor.S_RESIZE_CURSOR));
}
break;
default: // center
component.setCursor(Cursor.getDefaultCursor());
}
}
/**
* Make a smaller Rectangle and use it to locate the
* cursor relative to the Rectangle center.
*/
private int getOutcode(Point p) {
Rectangle r = (Rectangle)component.rect.clone();
r.grow(-PROX_DIST, -PROX_DIST);
return r.outcode(p.x, p.y);
}
/**
* Make a larger Rectangle and check to see if the
* cursor is over it.
*/
private boolean isOverRect(Point p) {
Rectangle r = (Rectangle)component.rect.clone();
r.grow(PROX_DIST, PROX_DIST);
return r.contains(p);
}
}
class Resizer2 extends MouseAdapter {
Resizing component2;
boolean dragging2 = false;
// Give user some leeway for selections.
final int PROX_DIST2 = 3;
public Resizer2(Resizing r2) {
component2 = r2;
}
@Override
public void mousePressed(MouseEvent e2) {
if(component2.getCursor() != Cursor.getDefaultCursor()) {
// If cursor is set for resizing, allow dragging.
dragging2 = true;
}
}
@Override
public void mouseReleased(MouseEvent e2) {
dragging2 = false;
}
@Override
public void mouseDragged(MouseEvent e2) {
if(dragging2) {
Point p2 = e2.getPoint();
Rectangle r2 = component2.rect2;
int type = component2.getCursor().getType();
int dx2 = p2.x - r2.x;
int dy2 = p2.y - r2.y;
switch(type) {
case Cursor.N_RESIZE_CURSOR:
int height = r2.height - dy2;
r2.setRect(r2.x, r2.y+dy2, r2.width, height);
break;
case Cursor.S_RESIZE_CURSOR:
height = dy2;
r2.setRect(r2.x, r2.y, r2.width, height);
break;
default:
System.out.println("unexpected type: " + type);
}
component2.repaint();
}
}
public void mouseMoved(MouseEvent e2) {
Point p2 = e2.getPoint();
if(!isOverRect(p2)) {
if(component2.getCursor() != Cursor.getDefaultCursor()) {
// If cursor is not over rect reset it to the default.
component2.setCursor(Cursor.getDefaultCursor());
}
return;
}
// Locate cursor relative to center of rect.
int outcode = getOutcode(p2);
Rectangle r2 = component2.rect2;
switch(outcode) {
case Rectangle.OUT_TOP:
if(Math.abs(p2.y - r2.y) < PROX_DIST2) {
component2.setCursor(Cursor.getPredefinedCursor(
Cursor.N_RESIZE_CURSOR));
}
break;
case Rectangle.OUT_BOTTOM:
if(Math.abs(p2.y - (r2.y+r2.height)) < PROX_DIST2) {
component2.setCursor(Cursor.getPredefinedCursor(
Cursor.S_RESIZE_CURSOR));
}
break;
default: // center
component2.setCursor(Cursor.getDefaultCursor());
}
}
/**
* Make a smaller Rectangle and use it to locate the
* cursor relative to the Rectangle center.
*/
private int getOutcode(Point p2) {
Rectangle r2 = (Rectangle)component2.rect2.clone();
r2.grow(-PROX_DIST2, -PROX_DIST2);
return r2.outcode(p2.x, p2.y);
}
/**
* Make a larger Rectangle and check to see if the
* cursor is over it.
*/
private boolean isOverRect(Point p2) {
Rectangle r2 = (Rectangle)component2.rect2.clone();
r2.grow(PROX_DIST2, PROX_DIST2);
return r2.contains(p2);
}
}