您的位置:首页 > 编程语言 > Java开发

Java矢量画图工具

2010-12-02 18:22 225 查看
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/*
* MyJFrame.java
*
* Created on 2010-12-1, 14:30:01
*/
/**
*
* @author yangpengfei
*/
public class MyJFrame extends javax.swing.JFrame {

JPanel dp;
public static int mode = 0;
int end = 0;

/** Creates new form MyJFrame */
public MyJFrame() {
initComponents();
Toolkit tk = getToolkit();
Dimension screenSize = tk.getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
this.setBounds(screenWidth / 4, screenHeight / 4, screenWidth / 2, screenHeight / 2);
getContentPane().setBackground(Color.LIGHT_GRAY);
dp = new DrawPanel();
dp.setBounds(new Rectangle(0, 0, screenWidth / 2 - 70, screenHeight / 2 - 150));
dp.setBackground(Color.WHITE);
add(dp);
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")

private void initComponents() {

jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
jTextField3 = new javax.swing.JTextField();
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenuItem2 = new javax.swing.JMenuItem();
jMenuItem3 = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
jMenuItem4 = new javax.swing.JMenuItem();
jMenuItem5 = new javax.swing.JMenuItem();
jMenuItem6 = new javax.swing.JMenuItem();
jMenuItem7 = new javax.swing.JMenuItem();
jMenuItem8 = new javax.swing.JMenuItem();
jMenu3 = new javax.swing.JMenu();
jMenu5 = new javax.swing.JMenu();
jMenuItem9 = new javax.swing.JMenuItem();
jMenuItem11 = new javax.swing.JMenuItem();
jMenuItem12 = new javax.swing.JMenuItem();
jMenuItem13 = new javax.swing.JMenuItem();
jMenu4 = new javax.swing.JMenu();
jMenuItem10 = new javax.swing.JMenuItem();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBackground(new java.awt.Color(255, 255, 255));

jPanel1.setBackground(new java.awt.Color(204, 204, 204));

jLabel1.setFont(new java.awt.Font("宋体", 0, 14));
jLabel1.setText("X:");

jLabel2.setFont(new java.awt.Font("宋体", 0, 14));
jLabel2.setText("Y:");

jTextField1.setEditable(false);
jTextField1.setText("0.0");

jTextField2.setEditable(false);
jTextField2.setText("0.0");

jLabel3.setText("鼠标状态:");

jTextField3.setEditable(false);
jTextField3.setText("UP");

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(354, 354, 354))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2)
.addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3)
.addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);

jMenu1.setText("文件");

jMenuItem1.setText("打开");
jMenu1.add(jMenuItem1);

jMenuItem2.setText("保存");
jMenu1.add(jMenuItem2);

jMenuItem3.setText("退出");
jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem3ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem3);

jMenuBar1.add(jMenu1);

jMenu2.setText("绘图");

jMenuItem4.setText("点线");
jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem4ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem4);

jMenuItem5.setText("直线");
jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem5ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem5);

jMenuItem6.setText("矩形");
jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem6ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem6);

jMenuItem7.setText("圆");
jMenuItem7.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem7ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem7);

jMenuItem8.setText("多边形");
jMenuItem8.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem8ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem8);

jMenuBar1.add(jMenu2);

jMenu3.setText("编辑");

jMenu5.setText("修改");

jMenuItem9.setText("直线");
jMenuItem9.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem9ActionPerformed(evt);
}
});
jMenu5.add(jMenuItem9);

jMenuItem11.setText("矩形");
jMenuItem11.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem11ActionPerformed(evt);
}
});
jMenu5.add(jMenuItem11);

jMenuItem12.setText("圆");
jMenuItem12.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem12ActionPerformed(evt);
}
});
jMenu5.add(jMenuItem12);

jMenuItem13.setText("多边形");
jMenuItem13.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem13ActionPerformed(evt);
}
});
jMenu5.add(jMenuItem13);

jMenu3.add(jMenu5);

jMenuBar1.add(jMenu3);

jMenu4.setText("帮助");

jMenuItem10.setText("关于");
jMenu4.add(jMenuItem10);

jMenuBar1.add(jMenu4);

setJMenuBar(jMenuBar1);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap(421, Short.MAX_VALUE)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
);

pack();
}

private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {
int tmp = JOptionPane.showConfirmDialog(this, "您确定要退出程序? Y/N", "退出程序", JOptionPane.YES_NO_OPTION);
if (tmp == 0) {
System.exit(0);
}
}

private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 0;
end = 0;
}

private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 1;
end = 0;
}

private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 2;
end = 0;
}

private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 3;
end = 0;
}

private void jMenuItem8ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 4;
end = 0;
}

private void jMenuItem9ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 5;
end = 0;
}

private void jMenuItem11ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 6;
end = 0;
}

private void jMenuItem12ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 7;
end = 0;
}

private void jMenuItem13ActionPerformed(java.awt.event.ActionEvent evt) {
mode = 8;
end = 0;
}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new MyJFrame().setVisible(true);
}
});
}

private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenu jMenu3;
private javax.swing.JMenu jMenu4;
private javax.swing.JMenu jMenu5;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem10;
private javax.swing.JMenuItem jMenuItem11;
private javax.swing.JMenuItem jMenuItem12;
private javax.swing.JMenuItem jMenuItem13;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JMenuItem jMenuItem4;
private javax.swing.JMenuItem jMenuItem5;
private javax.swing.JMenuItem jMenuItem6;
private javax.swing.JMenuItem jMenuItem7;
private javax.swing.JMenuItem jMenuItem8;
private javax.swing.JMenuItem jMenuItem9;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;

class DrawPanel extends JPanel implements MouseListener, MouseMotionListener {

boolean mouseState = false;
Point pPressed = new Point();
Point pReleased = new Point();
Point pMove = new Point();
Point pDragged = new Point();
Point pClicked = new Point();

Vector vPoint = new Vector();

Vector vLines = new Vector();

Vector vRect = new Vector();

Vector vCircle = new Vector();

Vector vPolygons = new Vector();
Vector vpPoint = new Vector();
Vector vpLines = new Vector();
int[] x;
int[] y;
Polygon op = new Polygon();
Point pFirst = new Point();
Point pLast = new Point();
boolean bePolygon = false;
boolean b1 = false;
boolean b2 = false;

Point vlPoint = new Point();
boolean beLines = false;
boolean beLinesmove = false;
Point linePoint1 = new Point();
Point linePoint2 = new Point();
Point linePoint3 = new Point();
Point linePoint4 = new Point();
Point pD = new Point();

Point rectPoint = new Point();
int rectW;
int rectH;
double dRect1, dRect2, dRect3, dRect4;
Point pRect = new Point();
Point pR = new Point();

Point pCircle = new Point();
double dCircle1, dCircle2;
int rX;
Point circlePoint1 = new Point();
Point circlePoint2 = new Point();

Polygon poly = new Polygon();
Point pPoly = new Point();
boolean bePoly = false;

public DrawPanel() {
setVisible(true);
addMouseListener(this);
addMouseMotionListener(this);
}

public void mouseClicked(MouseEvent e) {
jTextField1.setText(String.valueOf(e.getX()));
jTextField2.setText(String.valueOf(e.getY()));
pClicked = new Point(e.getX(), e.getY());
}

public void mousePressed(MouseEvent e) {
end = -1;
jTextField1.setText(String.valueOf(e.getX()));
jTextField2.setText(String.valueOf(e.getY()));
jTextField3.setText("DOWN");
e.consume();
if (e.getButton() == MouseEvent.BUTTON3 || e.getButton() == MouseEvent.BUTTON2) {
mouseState = true;
} else {
pPressed = new Point(e.getX(), e.getY());
if (mode == 0) {
vPoint.addElement(pPressed);
} else if (mode == 1) {
} else if (mode == 2) {
} else if (mode == 3) {
} else if (mode == 4) {
if (b1 == false) {
vpPoint.addElement(pPressed);
pLast = new Point(e.getX(), e.getY());
b1 = true;
} else {
if (vpPoint.size() == 0) {
pLast = new Point(e.getX(), e.getY());
} else {
pLast = vpPoint.lastElement();
}
vpPoint.addElement(pPressed);
}
} else if (mode == 5) {
for (Object o : vLines) {
Lines l = (Lines) o;

double xMin = l.p1.x < l.p2.x ? l.p1.x : l.p2.x;
double yMin = l.p1.y < l.p2.y ? l.p1.y : l.p2.y;
double xMax = l.p1.x > l.p2.x ? l.p1.x : l.p2.x;
double yMax = l.p1.y > l.p2.y ? l.p1.y : l.p2.y;

double d0 = twoDotLength(l.p1, l.p2);
double d1 = twoDotLength(l.p1, pPressed);
double d2 = twoDotLength(l.p2, pPressed);
double ps = (d0 + d1 + d2) / 2;
double s = Math.sqrt(ps * (ps - d0) * (ps - d1) * (ps - d2));
double h = 2 * s / d0;
if (d1 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
vLines.removeElement(l);
vlPoint = l.p2;
beLines = true;
break;
} else if (d2 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
vLines.removeElement(l);
vlPoint = l.p1;
beLines = true;
break;
} else if (h <= 3 && ((e.getX() < xMax + 3 && e.getX() > xMin - 3) && (e.getY() < yMax + 3 && e.getY() > yMin - 3))) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
linePoint1 = l.p1;
linePoint2 = l.p2;
vLines.removeElement(l);
beLinesmove = true;
pD = pPressed;
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
beLines = false;
}
}
} else if (mode == 6) {
for (Object o : vRect) {
Rect rec = (Rect) o;
rectPoint = rec.p0;
rectW = rec.w;
rectH = rec.h;
dRect1 = Math.abs(e.getX() - rec.p0.x);
dRect2 = Math.abs(e.getX() - (rec.p0.x + rec.w));
dRect3 = Math.abs(e.getY() - rec.p0.y);
dRect4 = Math.abs(e.getY() - (rec.p0.y + rec.h));

if (dRect1 <= 3 && e.getY() >= rec.p0.y && e.getY() <= rec.p0.y + rec.h) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
vRect.removeElement(rec);
break;
} else if (dRect2 <= 3 && e.getY() >= rec.p0.y && e.getY() <= rec.p0.y + rec.h) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
vRect.removeElement(rec);
break;
} else if (dRect3 <= 3 && e.getX() >= rec.p0.x && e.getX() <= rec.p0.x + rec.w) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
vRect.removeElement(rec);
break;
} else if (dRect4 <= 3 && e.getX() >= rec.p0.x && e.getX() <= rec.p0.x + rec.w) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
vRect.removeElement(rec);
break;
} else if (e.getX() >= rec.p0.x + 3 && e.getX() <= rec.p0.x + rec.w - 3 && e.getY() >= rec.p0.y + 3 && e.getY() <= rec.p0.y + rec.h - 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
pR = pPressed;
pRect = rec.p0;
vRect.removeElement(rec);
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
} else if (mode == 7) {
for (Object o : vCircle) {
Circle c = (Circle) o;
pCircle = c.p;
dCircle1 = twoDotLength(c.p, pPressed);
dCircle2 = Math.abs(dCircle1 - c.r);
if (dCircle2 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
vCircle.removeElement(c);
break;
} else if (dCircle1 < c.r - 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
circlePoint1 = c.p;
circlePoint2 = pPressed;
rX = c.r;
vCircle.removeElement(c);
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
} else if (mode == 8) {
for (Object o : vPolygons) {
Polygons po = (Polygons) o;
if (new Polygon(po.x, po.y, po.x.length).contains(pPressed)) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
poly = new Polygon(po.x, po.y, po.x.length);
pPoly = pPressed;
bePoly = true;
vPolygons.removeElement(po);
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
}
}
}

public void mouseReleased(MouseEvent e) {
jTextField1.setText(String.valueOf(e.getX()));
jTextField2.setText(String.valueOf(e.getY()));
jTextField3.setText("UP");
e.consume();
if (mouseState == true) {
} else {
pReleased = new Point(e.getX(), e.getY());
switch (mode) {
case 0:
end = 0;
repaint();
break;
case 1:
if (pPressed.equals(pReleased)) {
} else {
vLines.addElement(new Lines(pPressed, pReleased));
}
end = 0;
repaint();
break;
case 2:
if (pReleased.x < pPressed.x && pReleased.y < pPressed.y) {
vRect.addElement(new Rect(pReleased, pPressed.x - pReleased.x, pPressed.y - pReleased.y));
} else if (pReleased.x > pPressed.x && pReleased.y < pPressed.y) {
vRect.addElement(new Rect(new Point(pPressed.x, pReleased.y), pReleased.x - pPressed.x, pPressed.y - pReleased.y));
} else if (pReleased.x < pPressed.x && pReleased.y > pPressed.y) {
vRect.addElement(new Rect(new Point(pReleased.x, pPressed.y), pPressed.x - pReleased.x, pReleased.y - pPressed.y));
} else if (pReleased.x > pPressed.x && pReleased.y > pPressed.y) {
vRect.addElement(new Rect(pPressed, pReleased.x - pPressed.x, pReleased.y - pPressed.y));
}
end = 0;
repaint();
break;
case 3:
if (pPressed.equals(pReleased)) {
} else {
int r0 = (int) twoDotLength(pPressed, pReleased);
vCircle.addElement(new Circle(pPressed, r0));
}
end = 0;
repaint();
break;
case 4:
if (pReleased.equals(pPressed)) {
vpPoint.removeElementAt(vpPoint.size() - 1);
} else {
if (vpPoint.size() == 1) {
} else {
vpPoint.removeElementAt(vpPoint.size() - 1);
}

pFirst = vpPoint.firstElement();
if (vpLines.size() >= 2) {
Point lastPoint = vpPoint.lastElement();
for (int i = 0; i < vpLines.size() - 1; i++) {
Lines xl = vpLines.elementAt(i);
if (i == 0) {
b2 = Line2D.linesIntersect(xl.p1.x - 1, xl.p1.y - 1, xl.p2.x, xl.p2.y, lastPoint.x, lastPoint.y, pReleased.x, pReleased.y);
if (b2 == true) {
break;
} else {
}
} else {
b2 = Line2D.linesIntersect(xl.p1.x, xl.p1.y, xl.p2.x, xl.p2.y, lastPoint.x, lastPoint.y, pReleased.x, pReleased.y);
if (b2 == true) {
break;
} else {
}
}
}
}

if (b2 == true) {
} else {
double d = twoDotLength(pReleased, pFirst);
if (d <= 5) {
vpPoint.addElement(pFirst);
x = new int[vpPoint.size()];
y = new int[vpPoint.size()];
for (int i = 0; i < vpPoint.size(); i++) {
Point pl = vpPoint.elementAt(i);
x[i] = pl.x;
y[i] = pl.y;
}
op = new Polygon(x, y, x.length);
vPolygons.addElement(new Polygons(x, y));
bePolygon = true;
vpPoint.clear();
vpLines.clear();
} else {
vpPoint.addElement(pReleased);
vpLines.clear();
for (int i = 0; i < vpPoint.size() - 1; i++) {
Point px = vpPoint.elementAt(i);
Point py = vpPoint.elementAt(i + 1);
Lines ol = new Lines(px, py);
vpLines.addElement(ol);
}
}
}
}
end = 0;
repaint();
break;
case 5:
if (beLines == true) {
vLines.addElement(new Lines(vlPoint, pReleased));
beLines = false;
} else if (beLinesmove == true) {
vLines.addElement(new Lines(linePoint1, linePoint2));
beLinesmove = false;
}
end = 0;
repaint();
break;
case 6:
if (dRect1 <= 3) {
if (pPressed.y <= rectPoint.y + rectH && pPressed.y >= rectPoint.y) {
if (pDragged.x <= rectPoint.x + rectW) {
vRect.addElement(new Rect(new Point(pReleased.x, rectPoint.y), rectPoint.x + rectW - pReleased.x, rectH));
} else {
vRect.addElement(new Rect(new Point(rectPoint.x + rectW, rectPoint.y), pReleased.x - (rectPoint.x + rectW), rectH));
}
}
} else if (dRect2 <= 3) {
if (pPressed.y <= rectPoint.y + rectH && pPressed.y >= rectPoint.y) {
if (pDragged.x >= rectPoint.x) {
vRect.addElement(new Rect(rectPoint, pReleased.x - rectPoint.x, rectH));
} else {
vRect.addElement(new Rect(new Point(pReleased.x, rectPoint.y), rectPoint.x - pReleased.x, rectH));
}
}
} else if (dRect3 <= 3) {
if (pPressed.x <= rectPoint.x + rectW && pPressed.x >= rectPoint.x) {
if (pDragged.y <= rectPoint.y + rectH) {
vRect.addElement(new Rect(new Point(rectPoint.x, pReleased.y), rectW, rectPoint.y + rectH - pReleased.y));
} else {
vRect.addElement(new Rect(new Point(rectPoint.x, rectPoint.y + rectH), rectW, pReleased.y - (rectPoint.y + rectH)));
}
}
} else if (dRect4 <= 3) {
if (pPressed.x <= rectPoint.x + rectW && pPressed.x >= rectPoint.x) {
if (pDragged.y >= rectPoint.y) {
vRect.addElement(new Rect(rectPoint, rectW, pReleased.y - rectPoint.y));
} else {
vRect.addElement(new Rect(new Point(rectPoint.x, pReleased.y), rectW, rectPoint.y - pReleased.y));
}
}
} else if (pPressed.x < rectPoint.x + rectW - 3 && pPressed.x > rectPoint.x + 3 && pPressed.y < rectPoint.y + rectH - 3 && pPressed.y > rectPoint.y + 3) {
vRect.addElement(new Rect(pRect, rectW, rectH));
}
end = 0;
repaint();
break;
case 7:
if (dCircle2 <= 3) {
rX = (int) twoDotLength(pCircle, pReleased);
vCircle.addElement(new Circle(pCircle, rX));
} else if (dCircle1 <= rX - 3) {
vCircle.addElement(new Circle(circlePoint1, rX));
}
end = 0;
repaint();
break;
case 8:
if (bePoly == true) {
vPolygons.addElement(new Polygons(poly.xpoints, poly.ypoints));
}
end = 0;
repaint();
break;
}
}
mouseState = false;
bePoly = false;
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseDragged(MouseEvent e) {
jTextField1.setText(String.valueOf(e.getX()));
jTextField2.setText(String.valueOf(e.getY()));
e.consume();
if (mouseState == true) {
} else {
pDragged = new Point(e.getX(), e.getY());
if (mode == 0) {
vPoint.addElement(pDragged);
repaint();
} else if (mode == 1) {
repaint();
} else if (mode == 2) {
repaint();
} else if (mode == 3) {
repaint();
} else if (mode == 4) {
repaint();
} else if (mode == 5) {
linePoint1 = new Point(linePoint1.x + (pDragged.x - pD.x), linePoint1.y + (pDragged.y - pD.y));
linePoint2 = new Point(linePoint2.x + (pDragged.x - pD.x), linePoint2.y + (pDragged.y - pD.y));
repaint();
pD = new Point(e.getX(), e.getY());
} else if (mode == 6) {
pRect = new Point(pRect.x + (pDragged.x - pR.x), pRect.y + (pDragged.y - pR.y));
repaint();
pR = new Point(e.getX(), e.getY());
} else if (mode == 7) {
if (dCircle2 <= 3) {
rX = (int) twoDotLength(pCircle, pDragged);
} else if (dCircle1 <= rX - 3) {
circlePoint1 = new Point(circlePoint1.x + (pDragged.x - circlePoint2.x), circlePoint1.y + (pDragged.y - circlePoint2.y));
}
repaint();
circlePoint2 = new Point(e.getX(), e.getY());
} else if (mode == 8) {
if (bePoly == true) {
poly.translate(pDragged.x - pPoly.x, pDragged.y - pPoly.y);
repaint();
pPoly = new Point(e.getX(), e.getY());
}
}
}
}

public void mouseMoved(MouseEvent e) {
jTextField1.setText(String.valueOf(e.getX()));
jTextField2.setText(String.valueOf(e.getY()));
if (mouseState == true) {
} else {
pMove = new Point(e.getX(), e.getY());
if (mode == 0) {
} else if (mode == 1) {
} else if (mode == 2) {
} else if (mode == 3) {
} else if (mode == 4) {
} else if (mode == 5) {
for (Object o : vLines) {
Lines l = (Lines) o;

double xMin = l.p1.x < l.p2.x ? l.p1.x : l.p2.x;
double yMin = l.p1.y < l.p2.y ? l.p1.y : l.p2.y;
double xMax = l.p1.x > l.p2.x ? l.p1.x : l.p2.x;
double yMax = l.p1.y > l.p2.y ? l.p1.y : l.p2.y;

double d0 = twoDotLength(l.p1, l.p2);
double d1 = twoDotLength(l.p1, pMove);
double d2 = twoDotLength(l.p2, pMove);
double ps = (d0 + d1 + d2) / 2;
double s = Math.sqrt(ps * (ps - d0) * (ps - d1) * (ps - d2));
double h = 2 * s / d0;
if (d1 <= 3 || d2 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
break;
} else if (h <= 3 && ((e.getX() < xMax + 3 && e.getX() > xMin - 3) && (e.getY() < yMax + 3 && e.getY() > yMin - 3))) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
} else if (mode == 6) {
for (Object o : vRect) {
Rect rec = (Rect) o;
if (Math.abs(e.getX() - rec.p0.x) <= 3 && e.getY() >= rec.p0.y && e.getY() <= rec.p0.y + rec.h) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
break;
} else if (Math.abs(e.getX() - (rec.p0.x + rec.w)) <= 3 && e.getY() >= rec.p0.y && e.getY() <= rec.p0.y + rec.h) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
break;
} else if (Math.abs(e.getY() - rec.p0.y) <= 3 && e.getX() >= rec.p0.x && e.getX() <= rec.p0.x + rec.w) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
break;
} else if (Math.abs(e.getY() - (rec.p0.y + rec.h)) <= 3 && e.getX() >= rec.p0.x && e.getX() <= rec.p0.x + rec.w) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
break;
} else if (e.getX() >= rec.p0.x + 3 && e.getX() <= rec.p0.x + rec.w - 3 && e.getY() >= rec.p0.y + 3 && e.getY() <= rec.p0.y + rec.h - 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
} else if (mode == 7) {
for (Object o : vCircle) {
Circle c = (Circle) o;
double d1 = twoDotLength(c.p, pMove);
double d2 = Math.abs(d1 - c.r);
if (d2 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
break;
} else if (d1 < c.r - 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
} else if (mode == 8) {
for (Object o : vPolygons) {
Polygons po = (Polygons) o;
if (new Polygon(po.x, po.y, po.x.length).contains(pMove)) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
}
}
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
switch (mode) {
case 0:
if (end == -1) {
g.drawLine(pDragged.x, pDragged.y, pDragged.x, pDragged.y);
}
drawAll(g);
break;
case 1:
if (end == -1) {
g.setColor(Color.RED);
g.drawLine(pPressed.x, pPressed.y, pDragged.x, pDragged.y);
}
drawAll(g);
break;
case 2:
if (end == -1) {
g.setColor(Color.RED);
if (pDragged.x < pPressed.x && pDragged.y < pPressed.y) {
g.drawRect(pDragged.x, pDragged.y, pPressed.x - pDragged.x, pPressed.y - pDragged.y);
} else if (pDragged.x > pPressed.x && pDragged.y < pPressed.y) {
g.drawRect(pPressed.x, pDragged.y, pDragged.x - pPressed.x, pPressed.y - pDragged.y);
} else if (pDragged.x < pPressed.x && pDragged.y > pPressed.y) {
g.drawRect(pDragged.x, pPressed.y, pPressed.x - pDragged.x, pDragged.y - pPressed.y);
} else if (pDragged.x > pPressed.x && pDragged.y > pPressed.y) {
g.drawRect(pPressed.x, pPressed.y, pDragged.x - pPressed.x, pDragged.y - pPressed.y);
}
}
drawAll(g);
break;
case 3:
int r0 = (int) twoDotLength(pPressed, pDragged);
if (end == -1) {
g.setColor(Color.RED);
g.drawLine(pPressed.x, pPressed.y, pDragged.x, pDragged.y);
g.drawOval(pPressed.x - r0, pPressed.y - r0, 2 * r0, 2 * r0);
}
drawAll(g);
break;
case 4:
if (end == -1) {
g.setColor(Color.RED);
g.drawLine(pLast.x, pLast.y, pDragged.x, pDragged.y);
}
if (bePolygon == true) {
g.drawPolygon(op);
bePolygon = false;
}
drawAll(g);
break;
case 5:
if (end == -1) {
if (beLines == true) {
g.setColor(Color.RED);
g.drawLine(vlPoint.x, vlPoint.y, pDragged.x, pDragged.y);
} else if (beLinesmove == true) {
g.setColor(Color.RED);
g.drawLine(linePoint1.x, linePoint1.y, linePoint2.x, linePoint2.y);
}
}
drawAll(g);
break;
case 6:
if (end == -1) {
g.setColor(Color.RED);
if (dRect1 <= 3) {
if (pPressed.y <= rectPoint.y + rectH && pPressed.y >= rectPoint.y) {
if (pDragged.x <= rectPoint.x + rectW) {
g.drawRect(pDragged.x, rectPoint.y, rectPoint.x + rectW - pDragged.x, rectH);
} else {
g.drawRect(rectPoint.x + rectW, rectPoint.y, pDragged.x - (rectPoint.x + rectW), rectH);
}
}
} else if (dRect2 <= 3) {
if (pPressed.y <= rectPoint.y + rectH && pPressed.y >= rectPoint.y) {
if (pDragged.x >= rectPoint.x) {
g.drawRect(rectPoint.x, rectPoint.y, pDragged.x - rectPoint.x, rectH);
} else {
g.drawRect(pDragged.x, rectPoint.y, rectPoint.x - pDragged.x, rectH);
}
}
} else if (dRect3 <= 3) {
if (pPressed.x <= rectPoint.x + rectW && pPressed.x >= rectPoint.x) {
if (pDragged.y <= rectPoint.y + rectH) {
g.drawRect(rectPoint.x, pDragged.y, rectW, rectPoint.y + rectH - pDragged.y);
} else {
g.drawRect(rectPoint.x, rectPoint.y + rectH, rectW, pDragged.y - (rectPoint.y + rectH));
}
}
} else if (dRect4 <= 3) {
if (pPressed.x <= rectPoint.x + rectW && pPressed.x >= rectPoint.x) {
if (pDragged.y >= rectPoint.y) {
g.drawRect(rectPoint.x, rectPoint.y, rectW, pDragged.y - rectPoint.y);
} else {
g.drawRect(rectPoint.x, pDragged.y, rectW, rectPoint.y - pDragged.y);
}
}
} else if (pPressed.x < rectPoint.x + rectW - 3 && pPressed.x > rectPoint.x + 3 && pPressed.y < rectPoint.y + rectH - 3 && pPressed.y > rectPoint.y + 3) {
g.drawRect(pRect.x, pRect.y, rectW, rectH);
}
}
drawAll(g);
break;
case 7:
if (end == -1) {
g.setColor(Color.RED);
if (dCircle2 <= 3) {
g.drawLine(pCircle.x, pCircle.y, pDragged.x, pDragged.y);
g.drawOval(pCircle.x - rX, pCircle.y - rX, 2 * rX, 2 * rX);
} else if (dCircle1 <= rX - 3) {
g.drawOval(circlePoint1.x - rX, circlePoint1.y - rX, 2 * rX, 2 * rX);
}
}
drawAll(g);
break;
case 8:
if (end == -1) {
if (bePoly == true) {
g.setColor(Color.RED);
g.drawPolygon(poly);
}
}
drawAll(g);
break;
}
}

private void drawAll(Graphics g) {
g.setColor(Color.BLACK);
for (Object o : vPoint) {
Point xo = (Point) o;
g.drawLine(xo.x, xo.y, xo.x, xo.y);
}
for (Object o : vLines) {
Lines l = (Lines) o;
g.drawLine(l.p1.x, l.p1.y, l.p2.x, l.p2.y);
}
for (Object o : vCircle) {
Circle c = (Circle) o;
g.drawOval(c.p.x - c.r, c.p.y - c.r, 2 * c.r, 2 * c.r);
}
for (Object o : vRect) {
Rect rect = (Rect) o;
g.drawRect(rect.p0.x, rect.p0.y, rect.w, rect.h);
}
if (mode == 4 && bePolygon == false) {
for (Object o : vpLines) {
Lines ol = (Lines) o;
g.drawLine(ol.p1.x, ol.p1.y, ol.p2.x, ol.p2.y);
}
}
for (Object o : vPolygons) {
Polygons po = (Polygons) o;
g.drawPolygon(po.x, po.y, po.x.length);
}
}

private double twoDotLength(Point p1, Point p2) {
double length = 0;
length = Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
return length;
}
}

class Lines {

Point p1;
Point p2;

public Lines(Point p1, Point p2) {
this.p1 = p1;
this.p2 = p2;
}
}

class Circle {

Point p;
int r;

public Circle(Point p, int r) {
this.p = p;
this.r = r;
}
}

class Rect {

Point p0;
int w;
int h;

public Rect(Point p0, int w, int h) {
this.p0 = p0;
this.w = w;
this.h = h;
}
}

class Polygons {

int[] x;
int[] y;

public Polygons(int[] x, int[] y) {
this.x = x;
this.y = y;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: