class RectanglePanel extends JPanel implements MouseListener,MouseMotionListener{ public static final Integer NEW_RECTANGLE = new Integer(0); public static final Integer DRAG_RECTANGLE = new Integer(1); public static final Integer RESIZE_RECTANGLE = new Integer(2); private int pressedX; private int pressedY;
private List<RectEntry> rectList = new ArrayList<RectEntry>();
private Integer operateType; private RectEntry draggingRect; private RectEntry newingRect; private RectEntry resizingRect; private int startX; private int startY; private Random colorRandom = new Random(); public RectanglePanel(){ this.addMouseListener(this); this.addMouseMotionListener(this); } public void paintComponent(Graphics g){ Color bgColor = this.getBackground(); g.setColor(bgColor); g.fillRect(0, 0, this.getWidth(), this.getHeight()); for(int i=rectList.size()-1;i>=0;i--){ RectEntry rectEntry = rectList.get(i); Rectangle rect = rectEntry.getRect(); Color drawColor = rectEntry.getDrawColor(); g.setColor(drawColor); g.drawRect(rect.x, rect.y, rect.width, rect.height); Color fillColor = rectEntry.getFillColor(); g.setColor(fillColor); g.fillRect(rect.x, rect.y, rect.width, rect.height); } if(draggingRect != null){ Graphics2D g2d = (Graphics2D)g; Stroke oldStroke = g2d.getStroke(); g2d.setStroke(new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER,10.0f,new float[]{2,2},0)); Rectangle rect = draggingRect.getRect(); Color drawColor = draggingRect.getDrawColor(); g.setColor(drawColor); g.drawRect(rect.x, rect.y, rect.width, rect.height); g2d.setStroke(oldStroke); } if(newingRect != null){ Graphics2D g2d = (Graphics2D)g; Stroke oldStroke = g2d.getStroke(); g2d.setStroke(new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER,10.0f,new float[]{2,2},0)); Rectangle rect = newingRect.getRect(); Color drawColor = newingRect.getDrawColor(); g.setColor(drawColor); g.drawRect(rect.x, rect.y, rect.width, rect.height); g2d.setStroke(oldStroke); } if(resizingRect != null){ Graphics2D g2d = (Graphics2D)g; Stroke oldStroke = g2d.getStroke(); g2d.setStroke(new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER,10.0f,new float[]{2,2},0)); Rectangle rect = resizingRect.getRect(); Color drawColor = resizingRect.getDrawColor(); g.setColor(drawColor); g.drawRect(rect.x, rect.y, rect.width, rect.height); g2d.setStroke(oldStroke); } }
public void mouseDragged(MouseEvent e) { if(operateType == DRAG_RECTANGLE){ int draggedX = e.getX(); int draggedY = e.getY(); int moveX = draggedX-pressedX; int moveY = draggedY-pressedY; Rectangle rect = draggingRect.getRect(); int w = rect.width; int h = rect.height; rect.setBounds(startX+moveX, startY+moveY, w, h); this.repaint(); }else if(operateType == NEW_RECTANGLE){ int x = pressedX; int y = pressedY; int draggedX = e.getX(); int draggedY = e.getY(); Rectangle rect = newingRect.getRect(); Rectangle locationRect = new Rectangle();
if(draggedX-x>0){ locationRect.x = x; locationRect.width = draggedX-x; if(draggedY-y>0){ locationRect.y = y; locationRect.height = draggedY-y; }else{ locationRect.y = draggedY; locationRect.height = y-draggedY; } }else{ locationRect.x = draggedX; locationRect.width = x-draggedX; if(draggedY-y>0){ locationRect.y = y; locationRect.height = draggedY-y; }else{ locationRect.y = draggedY; locationRect.height = y-draggedY; } } rect.setBounds(locationRect); this.repaint(); }else if(operateType == RESIZE_RECTANGLE){ int x = startX; int y = startY; int draggedX = e.getX(); int draggedY = e.getY(); Rectangle rect = resizingRect.getRect(); Rectangle locationRect = new Rectangle();
}else if(operateType == NEW_RECTANGLE){ draggingRect = null; resizingRect = null; Color fillColor = new Color(colorRandom.nextInt(256),colorRandom.nextInt(256),colorRandom.nextInt(256)); Color drawColor = new Color(colorRandom.nextInt(256),colorRandom.nextInt(256),colorRandom.nextInt(256)); newingRect = new RectEntry(new Rectangle(pressedX,pressedY,0,0),fillColor,drawColor);
}else if(operateType == RESIZE_RECTANGLE){ RectEntry rectsAtPoint = (RectEntry)results[1]; resizingRect = rectsAtPoint; draggingRect = null; newingRect = null; Rectangle rect = resizingRect.getRect(); startX = rect.x; startY = rect.y; rectList.remove(resizingRect); this.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR)); } } public void mouseReleased(MouseEvent e) { if(operateType == DRAG_RECTANGLE){ int releasedX = e.getX(); int releasedY = e.getY(); int moveX = releasedX-pressedX; int moveY = releasedY-pressedY; Rectangle rect = draggingRect.getRect(); int w = rect.width; int h = rect.height; rect.setBounds(startX+moveX, startY+moveY, w, h); rectList.add(0, draggingRect); this.repaint(); }else if(operateType == NEW_RECTANGLE){ int x = pressedX; int y = pressedY; Rectangle rect = newingRect.getRect();
int releasedX = e.getX(); int releasedY = e.getY();
1。
先把距形画出来,
(每一个距形都是一个对象)
2。
每一个距形都能接受两个事件 拖拽和改变
(根据鼠标移动的位置来监听事件)
import java.awt.*;
import java.awt.event.*;
public class draw extends JFrame {
private int startX, startY, endX, endY;
private Graphics og;
private Image oimg;
public draw(){
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent me) {
endX = me.getX();//鼠标拖动时的坐标
endY = me.getY();
repaint();//图形重绘
}
});
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
startX = me.getX();//鼠标按下时的坐标
startY = me.getY();
}
public void mouseReleased(MouseEvent arg0) {
og.drawRect(startX, startY, endX-startX,endY-startY);//加一条直线至内存Graphics
}
});
this.setTitle("lele天空java编程");
this.setBounds(0, 0, 400, 400);//确定窗体在屏幕上的大小
this.setResizable(true);//窗体大小框显示(true)
this.setVisible(true);//窗体显示(true)
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗体
this.setLocation(0,0);//窗体在屏幕上的位置为(0,0)
oimg = createImage(800, 600);
og = oimg.getGraphics();
}
public void paint(Graphics g) {
super.paint(g);
g.drawImage(oimg, 0, 0, this);//先把之前保存在内存的Image画上
g.drawRect(startX, startY, endX-startX, endY-startY);//进行绘图
}
public static void main(String[] args) {
new draw();
}
}
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Stroke;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;import javax.swing.JFrame;
import javax.swing.JPanel;public class RectangleFrame{
public static void main(String[] args){
JFrame frame = new JFrame("Test Drag Rectangle");
Container c = frame.getContentPane();
c.setLayout(new BorderLayout());
JPanel rectPanel = new RectanglePanel();
c.add(rectPanel,BorderLayout.CENTER);
frame.setBounds(200,150,500,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
public static final Integer NEW_RECTANGLE = new Integer(0);
public static final Integer DRAG_RECTANGLE = new Integer(1);
public static final Integer RESIZE_RECTANGLE = new Integer(2);
private int pressedX;
private int pressedY;
private List<RectEntry> rectList = new ArrayList<RectEntry>();
private Integer operateType;
private RectEntry draggingRect;
private RectEntry newingRect;
private RectEntry resizingRect;
private int startX;
private int startY;
private Random colorRandom = new Random();
public RectanglePanel(){
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
public void paintComponent(Graphics g){
Color bgColor = this.getBackground();
g.setColor(bgColor);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
for(int i=rectList.size()-1;i>=0;i--){
RectEntry rectEntry = rectList.get(i);
Rectangle rect = rectEntry.getRect();
Color drawColor = rectEntry.getDrawColor();
g.setColor(drawColor);
g.drawRect(rect.x, rect.y, rect.width, rect.height);
Color fillColor = rectEntry.getFillColor();
g.setColor(fillColor);
g.fillRect(rect.x, rect.y, rect.width, rect.height);
}
if(draggingRect != null){
Graphics2D g2d = (Graphics2D)g;
Stroke oldStroke = g2d.getStroke();
g2d.setStroke(new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER,10.0f,new float[]{2,2},0));
Rectangle rect = draggingRect.getRect();
Color drawColor = draggingRect.getDrawColor();
g.setColor(drawColor);
g.drawRect(rect.x, rect.y, rect.width, rect.height);
g2d.setStroke(oldStroke);
}
if(newingRect != null){
Graphics2D g2d = (Graphics2D)g;
Stroke oldStroke = g2d.getStroke();
g2d.setStroke(new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER,10.0f,new float[]{2,2},0));
Rectangle rect = newingRect.getRect();
Color drawColor = newingRect.getDrawColor();
g.setColor(drawColor);
g.drawRect(rect.x, rect.y, rect.width, rect.height);
g2d.setStroke(oldStroke);
}
if(resizingRect != null){
Graphics2D g2d = (Graphics2D)g;
Stroke oldStroke = g2d.getStroke();
g2d.setStroke(new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER,10.0f,new float[]{2,2},0));
Rectangle rect = resizingRect.getRect();
Color drawColor = resizingRect.getDrawColor();
g.setColor(drawColor);
g.drawRect(rect.x, rect.y, rect.width, rect.height);
g2d.setStroke(oldStroke);
}
}
if(operateType == DRAG_RECTANGLE){
int draggedX = e.getX();
int draggedY = e.getY();
int moveX = draggedX-pressedX;
int moveY = draggedY-pressedY;
Rectangle rect = draggingRect.getRect();
int w = rect.width;
int h = rect.height;
rect.setBounds(startX+moveX, startY+moveY, w, h);
this.repaint();
}else if(operateType == NEW_RECTANGLE){
int x = pressedX;
int y = pressedY;
int draggedX = e.getX();
int draggedY = e.getY();
Rectangle rect = newingRect.getRect();
Rectangle locationRect = new Rectangle();
if(draggedX-x>0){
locationRect.x = x;
locationRect.width = draggedX-x;
if(draggedY-y>0){
locationRect.y = y;
locationRect.height = draggedY-y;
}else{
locationRect.y = draggedY;
locationRect.height = y-draggedY;
}
}else{
locationRect.x = draggedX;
locationRect.width = x-draggedX;
if(draggedY-y>0){
locationRect.y = y;
locationRect.height = draggedY-y;
}else{
locationRect.y = draggedY;
locationRect.height = y-draggedY;
}
}
rect.setBounds(locationRect);
this.repaint();
}else if(operateType == RESIZE_RECTANGLE){
int x = startX;
int y = startY;
int draggedX = e.getX();
int draggedY = e.getY();
Rectangle rect = resizingRect.getRect();
Rectangle locationRect = new Rectangle();
if(draggedX-x>0){
locationRect.x = x;
locationRect.width = draggedX-x;
if(draggedY-y>0){
locationRect.y = y;
locationRect.height = draggedY-y;
}else{
locationRect.y = draggedY;
locationRect.height = y-draggedY;
}
}else{
locationRect.x = draggedX;
locationRect.width = x-draggedX;
if(draggedY-y>0){
locationRect.y = y;
locationRect.height = draggedY-y;
}else{
locationRect.y = draggedY;
locationRect.height = y-draggedY;
}
}
rect.setBounds(locationRect);
this.repaint();
}
} public void mouseMoved(MouseEvent e) {
} public void mouseClicked(MouseEvent e) {
} public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
}
pressedX = e.getX();
pressedY = e.getY();
Object[] results = pointInRect(pressedX,pressedY);
operateType = (Integer)results[0];
if(operateType == DRAG_RECTANGLE){
RectEntry rectsAtPoint = (RectEntry)results[1];
draggingRect = rectsAtPoint;
newingRect = null;
resizingRect = null;
Rectangle rect = draggingRect.getRect();
startX = rect.x;
startY = rect.y;
rectList.remove(draggingRect);
}else if(operateType == NEW_RECTANGLE){
draggingRect = null;
resizingRect = null;
Color fillColor = new Color(colorRandom.nextInt(256),colorRandom.nextInt(256),colorRandom.nextInt(256));
Color drawColor = new Color(colorRandom.nextInt(256),colorRandom.nextInt(256),colorRandom.nextInt(256));
newingRect = new RectEntry(new Rectangle(pressedX,pressedY,0,0),fillColor,drawColor);
}else if(operateType == RESIZE_RECTANGLE){
RectEntry rectsAtPoint = (RectEntry)results[1];
resizingRect = rectsAtPoint;
draggingRect = null;
newingRect = null;
Rectangle rect = resizingRect.getRect();
startX = rect.x;
startY = rect.y;
rectList.remove(resizingRect);
this.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));
}
} public void mouseReleased(MouseEvent e) {
if(operateType == DRAG_RECTANGLE){
int releasedX = e.getX();
int releasedY = e.getY();
int moveX = releasedX-pressedX;
int moveY = releasedY-pressedY;
Rectangle rect = draggingRect.getRect();
int w = rect.width;
int h = rect.height;
rect.setBounds(startX+moveX, startY+moveY, w, h);
rectList.add(0, draggingRect);
this.repaint();
}else if(operateType == NEW_RECTANGLE){
int x = pressedX;
int y = pressedY;
Rectangle rect = newingRect.getRect();
int releasedX = e.getX();
int releasedY = e.getY();
Rectangle locationRect = new Rectangle();
if(releasedX-x>0){
locationRect.x = x;
locationRect.width = releasedX-x;
if(releasedY-y>0){
locationRect.y = y;
locationRect.height = releasedY-y;
}else{
locationRect.y = releasedY;
locationRect.height = y-releasedY;
}
}else{
locationRect.x = releasedX;
locationRect.width = x-releasedX;
if(releasedY-y>0){
locationRect.y = y;
locationRect.height = releasedY-y;
}else{
locationRect.y = releasedY;
locationRect.height = y-releasedY;
}
}
rect.setBounds(locationRect);
rectList.add(0, newingRect);
this.repaint();
}else if(operateType == RESIZE_RECTANGLE){
int x = startX;
int y = startY;
Rectangle rect = resizingRect.getRect();
int releasedX = e.getX();
int releasedY = e.getY();
Rectangle locationRect = new Rectangle();
if(releasedX-x>0){
locationRect.x = x;
locationRect.width = releasedX-x;
if(releasedY-y>0){
locationRect.y = y;
locationRect.height = releasedY-y;
}else{
locationRect.y = releasedY;
locationRect.height = y-releasedY;
}
}else{
locationRect.x = releasedX;
locationRect.width = x-releasedX;
if(releasedY-y>0){
locationRect.y = y;
locationRect.height = releasedY-y;
}else{
locationRect.y = releasedY;
locationRect.height = y-releasedY;
}
}
rect.setBounds(locationRect);
rectList.add(0, resizingRect);
this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
this.repaint();
}
operateType = null;
draggingRect = null;
newingRect = null;
}
Integer type = NEW_RECTANGLE;
Object[] results = new Object[2];
RectEntry containePointRectEntry = null;
for(int i=0;i<rectList.size();i++){
RectEntry rectEntry = rectList.get(i);
Rectangle rect = rectEntry.getRect();
if(rect.contains(x, y)){
Rectangle temp = new Rectangle();
temp.x = rect.x;
temp.y = rect.y;
temp.width = rect.width-5;
temp.height = rect.height-5;
if(temp.contains(x, y)){
type = DRAG_RECTANGLE;
}else{
type = RESIZE_RECTANGLE;
}
containePointRectEntry = rectEntry;
break;
}
}
results[0] = type;
results[1] = containePointRectEntry;
return results;
}
}
class RectEntry{
private Rectangle rect;
private Color fillColor;
private Color drawColor;
public RectEntry(Rectangle rect,Color fillColor,Color drawColor){
this.rect = rect;
this.fillColor = fillColor;
this.drawColor = drawColor;
}
public Rectangle getRect() {
return rect;
}
public void setRect(Rectangle rect) {
this.rect = rect;
}
public Color getFillColor() {
return fillColor;
}
public void setFillColor(Color fillColor) {
this.fillColor = fillColor;
}
public Color getDrawColor() {
return drawColor;
}
public void setDrawColor(Color drawColor) {
this.drawColor = drawColor;
}
}
private RectEntry newingRect;
private RectEntry resizingRect;这个三个是什么?