/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* VectorFrameTest.java
*
* Created on 2010-11-4, 15:25:14
*/
package vectordraw;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;
/**
*
* @author tangxiaolong
*/
public class VectorFrame {
public static void main(String[] args) {
new VectorFrameTest();
}
}
class VectorFrameTest extends javax.swing.JFrame {
//选择模式,0代表直线绘制,1代表椭圆绘制,2代表矩形绘制
public static int mode = 0;
private JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = null;
/** Creates new form VectorFrameTest */
public VectorFrameTest() {
this.setVisible(true);
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);
JPanel jp = new DrawPanel();
jp.addMouseListener(new MouseAdapter() {
});
add(jp);
}
/** 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")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
toolBar = new javax.swing.JToolBar();
line = new javax.swing.JButton();
circle = new javax.swing.JButton();
rectangle = new javax.swing.JButton();
edit = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
mainMenuBar = new javax.swing.JMenuBar();
fileMenu = new javax.swing.JMenu();
javax.swing.JMenuItem openMenuItem = new javax.swing.JMenuItem();
saveMenuItem = new javax.swing.JMenuItem();
exitMenuItem = new javax.swing.JMenuItem();
editMenu = new javax.swing.JMenu();
jSeparator1 = new javax.swing.JSeparator();
helpMenu = new javax.swing.JMenu();
helpMenuItem = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("VectorDraw");
toolBar.setRollover(true);
line.setText("线段");
line.setFocusable(false);
line.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
line.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
line.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
lineActionPerformed(evt);
}
});
toolBar.add(line);
circle.setText("圆");
circle.setFocusable(false);
circle.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
circle.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
circle.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
circleActionPerformed(evt);
}
});
toolBar.add(circle);
rectangle.setText("矩形");
rectangle.setFocusable(false);
rectangle.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
rectangle.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
rectangle.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
rectangleActionPerformed(evt);
}
});
toolBar.add(rectangle);
edit.setText("修改");
edit.setFocusable(false);
edit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
edit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
edit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editActionPerformed(evt);
}
});
toolBar.add(edit);
jLabel1.setText(" X:");
toolBar.add(jLabel1);
jLabel3.setText("0.0");
jLabel3.setSize(10, 20);
toolBar.add(jLabel3);
jLabel2.setText(" Y:");
toolBar.add(jLabel2);
jLabel4.setText("0.0");
jLabel4.setSize(10, 20);
toolBar.add(jLabel4);
jLabel5.setText(" ");
toolBar.add(jLabel5);
jLabel6.setText("UP");
toolBar.add(jLabel6);
getContentPane().add(toolBar, java.awt.BorderLayout.PAGE_START);
fileMenu.setText("文件");
fileMenu.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fileMenuActionPerformed(evt);
}
});
openMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
openMenuItem.setText("打开");
openMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
openMenuItemActionPerformed(evt);
}
});
fileMenu.add(openMenuItem);
saveMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
saveMenuItem.setText("保存");
saveMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveMenuItemActionPerformed(evt);
}
});
fileMenu.add(saveMenuItem);
exitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK));
exitMenuItem.setText("退出");
exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
exitMenuItemActionPerformed(evt);
}
});
fileMenu.add(exitMenuItem);
mainMenuBar.add(fileMenu);
editMenu.setText("编辑");
editMenu.add(jSeparator1);
mainMenuBar.add(editMenu);
helpMenu.setText("帮助");
helpMenuItem.setText("关于");
helpMenu.add(helpMenuItem);
mainMenuBar.add(helpMenu);
setJMenuBar(mainMenuBar);
pack();
}// </editor-fold>
private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
int tmp = JOptionPane.showConfirmDialog(this, "请选择是否退出程序?", "退出程序", JOptionPane.YES_NO_OPTION);
if (tmp == 0) {
System.exit(0);
}
}
private void lineActionPerformed(java.awt.event.ActionEvent evt) {
mode = 0;
}
private void circleActionPerformed(java.awt.event.ActionEvent evt) {
mode = 1;
}
private void saveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
chooser.setDialogTitle("保存我的文件");
filter = new FileNameExtensionFilter("Txt Files", "txt", "*.*");
chooser.setFileFilter(filter);
int returnVal = chooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {//确定保存了
String filePath = chooser.getSelectedFile().getAbsolutePath();
String fileName = chooser.getSelectedFile().getName();
Pattern p = Pattern.compile("(.*)+//.(txt)$");
Matcher m = p.matcher(fileName);
if (!m.matches()) {
filePath = filePath + ".txt";
}
File f = new File(filePath);
try {
PrintStream ps = new PrintStream(f);
ps.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
}
}
private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
chooser.setDialogTitle("寻找我的文件");
filter = new FileNameExtensionFilter("Txt Files", "txt", "*.*");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("你已选择打开" + chooser.getSelectedFile().getName());
String filePath = chooser.getSelectedFile().getAbsolutePath();
File f = new File(filePath);
InputStream is = null;
try {
is = new FileInputStream(f);
int temp = 0;
while ((temp = is.read()) != -1) {
System.out.println("" + (char) temp);
}
is.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private void editActionPerformed(java.awt.event.ActionEvent evt) {
mode = 3;
}
private void rectangleActionPerformed(java.awt.event.ActionEvent evt) {
mode = 2;
}
private void fileMenuActionPerformed(java.awt.event.ActionEvent evt) {
}
// Variables declaration - do not modify
private javax.swing.JButton circle;
private javax.swing.JButton edit;
private javax.swing.JMenu editMenu;
private javax.swing.JMenuItem exitMenuItem;
private javax.swing.JMenu fileMenu;
private javax.swing.JMenu helpMenu;
private javax.swing.JMenuItem helpMenuItem;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JButton line;
private javax.swing.JMenuBar mainMenuBar;
private javax.swing.JButton rectangle;
private javax.swing.JMenuItem saveMenuItem;
private javax.swing.JToolBar toolBar;
// End of variables declaration
class DrawPanel extends JPanel implements MouseListener, MouseMotionListener {
Vector lines = new Vector();
Vector ellipses = new Vector();
Vector rectangles = new Vector();
int x1, y1;
int x2, y2;
int end = -1;
//当鼠标pressed的时候的变量
//直线
int l1 = 4;//鼠标到直线两端点的距离 (大于三的任何值一下同是)
int l2 = 4;
int mx, my, nx, ny;//直线端点坐标
//圆
int rx0, ry0, rr0;//圆心和半径
int rl1 = 4;//rl1鼠标到圆心的距离,rl2鼠标到圆的边框的距离
int rl2 = 4;
//矩形
int recx1, recy1, recx2, recy2;//矩形对角顶点坐标
int recj1, recj2, recj3, recj4;//分别对应到四条边的距离
int recw, rech;
//矩形
int rx1, ry1, rx2, ry2;//矩形对角顶点坐标
int j1, j2, j3, j4;//分别对应到四条边的距离
public DrawPanel() {
setBackground(Color.white);
addMouseMotionListener(this);
addMouseListener(this);
}
public void mouseDragged(MouseEvent e) {
jLabel3.setText(String.valueOf(e.getX()));
jLabel4.setText(String.valueOf(e.getY()));
e.consume();
end = -1;
x2 = e.getX();
y2 = e.getY();
if (mode == 3) {
if (l1 <= l2 && l1 <= 3) {
repaint();
} else if (l2 < l1 && l2 <= 3) {
repaint();
} else if (rl2 <= rl1 && rl2 <= 3) {
repaint();
} else if (rl1 < rl2 && rl1 <= 3) {
repaint();
} else if (recj1 <= 3) {
if (y1 <= recy2 && y1 >= recy1) {
repaint();
}
} else if (recj2 <= 3) {
if (y1 <= recy2 && y1 >= recy1) {
repaint();
}
} else if (recj3 <= 3) {
if (x1 <= recx2 && x1 >= recx1) {
repaint();
}
} else if (recj4 <= 3) {
if (x1 <= recx2 && x1 >= recx1) {
repaint();
}
} else {
}
} else {
repaint();
}
}
public void mouseMoved(MouseEvent e) {
jLabel3.setText(String.valueOf(e.getX()));
jLabel4.setText(String.valueOf(e.getY()));
//修改模式下才去做这些判断
if (mode == 3) {
boolean state = false;
//在移动过程中,当鼠标移动到直线的两个端点时鼠标发生变化,变成十字形
if (state == false) {
for (Object o : lines) {
Rectangle rec = (Rectangle) o;
if (((e.getX() <= (rec.x + 3)) && (e.getX() >= (rec.x - 3))) && ((e.getY() <= (rec.y + 3)) && (e.getY() >= (rec.y - 3)))) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
state = true;
break;
} else if (((e.getX() <= (rec.width + 3)) && (e.getX() >= (rec.width - 3))) && ((e.getY() <= (rec.height + 3)) && (e.getY() >= (rec.height - 3)))) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
state = true;
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
state = false;
}
}
}
//在鼠标移动过程呢中,当鼠标经过圆的边框时,鼠标变成可修改的十字形,经过圆心时变成可拖拽的形状
if (state == false) {
int x0, y0, r0;//圆心和半径
int clm = 1000000;//clm鼠标到圆心的最小距离 rlm鼠标到圆的边框的最小距离
int rlm = 1000000;
int cl, rl;
for (Object o : ellipses) {
Rectangle rec = (Rectangle) o;
r0 = rec.width / 2;
x0 = rec.x + r0;
y0 = rec.y + r0;
cl = (int) Math.sqrt((e.getX() - x0) * (e.getX() - x0) + (e.getY() - y0) * (e.getY() - y0));
clm = cl < clm ? cl : clm;
rl = Math.abs(cl - r0);
rlm = rl < rlm ? rl : rlm;
}
if (rlm <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
state = true;
} else if (clm <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
state = true;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
state = false;
}
}
//矩形
if (state == false) {
for (Object o : rectangles) {
Rectangle rec = (Rectangle) o;
rx1 = rec.x;
ry1 = rec.y;
rx2 = rec.x + rec.width;
ry2 = rec.y + rec.height;
j1 = Math.abs(e.getX() - rx1);
j2 = Math.abs(e.getX() - rx2);
j3 = Math.abs(e.getY() - ry1);
j4 = Math.abs(e.getY() - ry2);
// j1 = j1 < j2 ? j1 : j2;
// j3 = j3 < j4 ? j3 : j4;
if (j1 <= 3) {
if ((e.getY() < ry2) && (e.getY() > ry1)) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
state = true;
break;
}
} else if (j2 <= 3) {
if ((e.getY() < ry2) && (e.getY() > ry1)) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
state = true;
break;
}
} else if (j3 <= 3) {
if ((e.getX() < rx2) && (e.getX() > rx1)) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
state = true;
break;
}
} else if (j4 <= 3) {
if ((e.getX() < rx2) && (e.getX() > rx1)) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
state = true;
break;
}
} else {
state = false;
}
}
}
}
}
public void mousePressed(MouseEvent e) {
jLabel6.setText("DOWN");
e.consume();
x1 = e.getX();
y1 = e.getY();
x2 = e.getX();
y2 = e.getY();
if (mode == 3) {
boolean state = false;
//直线
if (state == false) {
for (Object o : lines) {
Rectangle rec = (Rectangle) o;
l1 = (int) Math.sqrt((x1 - rec.x) * (x1 - rec.x) + (y1 - rec.y) * (y1 - rec.y));
l2 = (int) Math.sqrt((x1 - rec.width) * (x1 - rec.width) + (y1 - rec.height) * (y1 - rec.height));
if (l1 <= l2 && l1 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
mx = rec.width;
my = rec.height;
lines.remove(rec);
state = true;
break;
} else if (l2 < l1 && l2 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
mx = rec.x;
my = rec.y;
lines.remove(rec);
state = true;
break;
} else {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
state = false;
}
}
}
//圆
if (state == false) {
for (Object o : ellipses) {
Rectangle rec = (Rectangle) o;
rr0 = rec.width / 2;
rx0 = rec.x + rr0;
ry0 = rec.y + rr0;
rl1 = (int) Math.sqrt((x1 - rx0) * (x1 - rx0) + (y1 - ry0) * (y1 - ry0));
rl2 = Math.abs(rl1 - rr0);
if (rl2 <= rl1 && rl2 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
ellipses.remove(rec);
state = true;
break;
} else if (rl1 < rl2 && rl1 <= 3) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
ellipses.remove(rec);
state = true;
break;
} else {
state = false;
}
}
}
//矩形
if (state == false) {
for (Object o : rectangles) {
Rectangle rec = (Rectangle) o;
recx1 = rec.x;
recy1 = rec.y;
recw = rec.width;
rech = rec.height;
recx2 = rec.x + rec.width;
recy2 = rec.y + rec.height;
recj1 = Math.abs(e.getX() - recx1);
recj2 = Math.abs(e.getX() - recx2);
recj3 = Math.abs(recy1 - e.getY());
recj4 = Math.abs(recy2 - e.getY());
if (recj1 <= 3) {
if ((e.getY() <= recy2) && (e.getY() >= recy1)) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
rectangles.removeElement(rec);
state = true;
break;
}
} else if (recj2 <= 3) {
if ((e.getY() <= recy2) && (e.getY() >= recy1)) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
rectangles.removeElement(rec);
state = true;
break;
}
} else if (recj3 <= 3) {
if ((e.getX() <= recx2) && (e.getX() >= recx1)) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
rectangles.removeElement(rec);
state = true;
break;
}
} else if (recj4 <= 3) {
if ((e.getX() <= recx2) && (e.getX() >= recx1)) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
rectangles.removeElement(rec);
state = true;
break;
}
} else {
}
}
}
}
}
@SuppressWarnings("unchecked")
public void mouseReleased(MouseEvent e) {
jLabel6.setText("UP");
e.consume();
end = 0;
switch (mode) {
case 0:
lines.addElement(new Rectangle(x1, y1, e.getX(), e.getY()));
break;
case 1:
double r = Math.sqrt((e.getX() - x1) * (e.getX() - x1) + (e.getY() - y1) * (e.getY() - y1));
int intr = (int) r;
ellipses.addElement(new Rectangle(x1 - intr, y1 - intr, 2 * intr, 2 * intr));
break;
case 2:
if ((e.getX() - x1) > 0 && (e.getY() - y1) > 0) {
rectangles.addElement(new Rectangle(x1, y1, e.getX() - x1, e.getY() - y1));
} else if ((e.getX() - x1) < 0 && (e.getY() - y1) < 0) {
rectangles.addElement(new Rectangle(e.getX(), e.getY(), Math.abs(e.getX() - x1), Math.abs(e.getY() - y1)));
} else if ((e.getX() - x1) > 0 && (e.getY() - y1) < 0) {
rectangles.addElement(new Rectangle(x1, e.getY(), e.getX() - x1, Math.abs(e.getY() - y1)));
} else if ((e.getX() - x1) < 0 && (e.getY() - y1) > 0) {
rectangles.addElement(new Rectangle(e.getX(), y1, Math.abs(e.getX() - x1), e.getY() - y1));
}
break;
case 3:
if (l1 <= l2 && l1 <= 3) {
lines.addElement(new Rectangle(mx, my, e.getX(), e.getY()));
} else if (l2 < l1 && l2 <= 3) {
lines.addElement(new Rectangle(mx, my, e.getX(), e.getY()));
} else if (rl2 <= rl1 && rl2 <= 3) {
int rr = (int) Math.sqrt((e.getX() - rx0) * (e.getX() - rx0) + (e.getY() - ry0) * (e.getY() - ry0));
ellipses.addElement(new Rectangle(rx0 - rr, ry0 - rr, rr * 2, rr * 2));
} else if (rl1 < rl2 && rl1 <= 3) {
ellipses.addElement(new Rectangle(e.getX() - rr0, e.getY() - rr0, 2 * rr0, 2 * rr0));
} else if (recj1 <= 3) {
if (y1 <= recy2 && y1 >= recy1) {
if (e.getX() <= recx2) {
rectangles.addElement(new Rectangle(e.getX(), recy1, recx2 - e.getX(), rech));
} else {
rectangles.addElement(new Rectangle(recx2, recy1, e.getX() - recx2, rech));
}
}
} else if (recj2 <= 3) {
if (y1 <= recy2 && y1 >= recy1) {
if (e.getX() >= recx1) {
rectangles.addElement(new Rectangle(recx1, recy1, e.getX() - recx1, rech));
} else {
rectangles.addElement(new Rectangle(e.getX(), recy1, recx1 - e.getX(), rech));
}
}
} else if (recj3 <= 3) {
if (x1 <= recx2 && x1 >= recx1) {
if (e.getY() <= recy2) {
rectangles.addElement(new Rectangle(recx1, e.getY(), recw, recy2 - e.getY()));
} else {
rectangles.addElement(new Rectangle(recx1, recy2, recw, e.getY() - recy2));
}
}
} else if (recj4 <= 3) {
if (x1 <= recx2 && x1 >= recx1) {
if (e.getY() >= recy1) {
rectangles.addElement(new Rectangle(recx1, recy1, recw, e.getY() - recy1));
} else {
rectangles.addElement(new Rectangle(recx1, e.getY(), recw, recy1 - e.getY()));
}
}
}
break;
default:
throw new RuntimeException();
}
repaint();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
switch (mode) {
case 0:
if (end == -1) {
g.setColor(Color.red);
g.drawLine(x1, y1, x2, y2);
}
g.setColor(Color.black);
drawAll(g);
break;
case 1:
if (end == -1) {
g.setColor(Color.red);
double r = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
int intr = (int) r;
g.drawLine(x1, y1, x2, y2);
g.drawOval(x1 - intr, y1 - intr, 2 * intr, 2 * intr);
}
g.setColor(Color.black);
drawAll(g);
break;
case 2:
if (end == -1) {
g.setColor(Color.red);
if ((x2 - x1) > 0 && (y2 - y1) > 0) {
g.drawRect(x1, y1, x2 - x1, y2 - y1);
} else if ((x2 - x1) < 0 && (y2 - y1) < 0) {
g.drawRect(x2, y2, Math.abs(x2 - x1), Math.abs(y2 - y1));
} else if ((x2 - x1) > 0 && (y2 - y1) < 0) {
g.drawRect(x1, y2, x2 - x1, Math.abs(y2 - y1));
} else if ((x2 - x1) < 0 && (y2 - y1) > 0) {
g.drawRect(x2, y1, Math.abs(x2 - x1), y2 - y1);
}
}
g.setColor(Color.black);
drawAll(g);
break;
case 3:
if (l1 <= l2 && l1 <= 3) {
g.setColor(Color.red);
g.drawLine(x2, y2, mx, my);
} else if (l2 < l1 && l2 <= 3) {
g.setColor(Color.red);
g.drawLine(x2, y2, mx, my);
} else if (rl2 <= rl1 && rl2 <= 3) {
g.setColor(Color.red);
int rr = (int) Math.sqrt((x2 - rx0) * (x2 - rx0) + (y2 - ry0) * (y2 - ry0));
g.drawOval(rx0 - rr, ry0 - rr, rr * 2, rr * 2);
} else if (rl1 < rl2 && rl1 <= 3) {
g.setColor(Color.red);
g.drawOval(x2 - rr0, y2 - rr0, 2 * rr0, 2 * rr0);
} else if (recj1 <= 3) {
if (y1 <= recy2 && y1 >= recy1) {
if (x2 <= recx2) {
g.setColor(Color.red);
g.drawRect(x2, recy1, recx2 - x2, rech);
} else {
g.setColor(Color.red);
g.drawRect(recx2, recy1, x2 - recx2, rech);
}
}
} else if (recj2 <= 3) {
if (y1 <= recy2 && y1 >= recy1) {
if (x2 >= recx1) {
g.setColor(Color.red);
g.drawRect(recx1, recy1, x2 - recx1, rech);
} else {
g.setColor(Color.red);
g.drawRect(x2, recy1, recx1 - x2, rech);
}
}
} else if (recj3 <= 3) {
if (x1 <= recx2 && x1 >= recx1) {
if (y2 <= recy2) {
g.setColor(Color.red);
g.drawRect(recx1, y2, recw, recy2 - y2);
} else {
g.setColor(Color.red);
g.drawRect(recx1, recy2, recw, y2 - recy2);
}
}
} else if (recj4 <= 3) {
if (x1 <= recx2 && x1 >= recx1) {
if (y2 >= recy1) {
g.setColor(Color.red);
g.drawRect(recx1, recy1, recw, y2 - recy1);
} else {
g.setColor(Color.red);
g.drawRect(recx1, y2, recw, recy1 - y2);
}
}
}
g.setColor(Color.BLACK);
drawAll(g);
break;
}
}
private void drawAll(Graphics g) {
for (Object r : lines) {
Rectangle rec = (Rectangle) r;
g.drawLine(rec.x, rec.y, rec.width, rec.height);
}
for (Object r : ellipses) {
Rectangle rec = (Rectangle) r;
g.drawOval(rec.x, rec.y, rec.width, rec.height);
}
for (Object r : rectangles) {
Rectangle rec = (Rectangle) r;
g.drawRect(rec.x, rec.y, rec.width, rec.height);
}
}
}
}