JPaint.java
上传用户:sandywf
上传日期:2022-08-10
资源大小:300k
文件大小:50k
源码类别:

绘图程序

开发平台:

Java

  1. /*
  2.  * 简易画图程序
  3.  *
  4.  * Filename:  JavaPainting.java
  5.  * Author:    Keven
  6.  * Date:      2008-12
  7.  */
  8. import java.io.*;
  9. import java.awt.*;
  10. import java.awt.font.*;
  11. import java.awt.geom.*;
  12. import java.util.*;
  13. import java.awt.event.*;
  14. import javax.swing.*;
  15. import javax.swing.filechooser.FileFilter;
  16. /*
  17.  *  类名:Shape
  18.  *  功能描述:所画形状的基类,所有所画形状都由此类继承.
  19.  *  包括形状类型枚举常量,起始终点坐标,画线宽度,颜色,是否填满,是否被选中等
  20.  *  以及一些方法,如给定起点终点坐标,得到起点终点坐标,得到起始终点坐标中的最大值,读写操作等
  21.  */
  22. class Shape {
  23. public static final int LINE = 1;
  24. public static final int SQUARE = 2;
  25. public static final int ELLIPSE = 3;
  26. public static final int ROUND = 4;
  27. public static final int PEN = 5;
  28. public static final int ERASER = 6;
  29. public static final int ACUTESHAPE = 7;
  30. public static final int WORD = 8;
  31. public static final int ACUTELINE = 9;
  32. public static final int ACUTEELLIPSE = 10;
  33. public static final int ACUTEROUND = 11;
  34. public static final int ACUTESQUARE = 12;
  35. public float PENSTROKE = 3.0f;
  36. public float ERASERSTROKE = 10.0f;
  37. protected int startX;
  38. protected int startY;
  39. protected int endX;
  40. protected int endY; // 起始终点坐标
  41. protected float stroke = 1.0f; // 定义线条粗细属性
  42. protected int type; // 定义字体属性
  43. protected String s1;
  44. protected String s2; // 定义字体风格属性
  45. protected boolean isFill;
  46. protected boolean isSelected;
  47. protected Color color;
  48. protected int shape;
  49. public Shape() {
  50. isFill = false;
  51. // 图形是否是填充
  52. isSelected = false;
  53. // 图形是否被选中
  54. color = Color.BLACK;
  55. // 默认颜色黑
  56. }
  57. public Shape(int sx, int sy, int ex, int ey) {
  58. this();
  59. startX = sx;
  60. startY = sy;
  61. endX = ex;
  62. endY = ey;
  63. }
  64. public void setStart(int x, int y) {
  65. startX = x;
  66. startY = y;
  67. }
  68. public void setEnd(int x, int y) {
  69. endX = x;
  70. endY = y;
  71. }
  72. public Point2D getStart() {
  73. return new Point2D.Double(startX, startY);
  74. }
  75. public Point2D getEnd() {
  76. return new Point2D.Double(endX, endY);
  77. }
  78. protected int maxX() {
  79. return (startX >= endX) ? startX : endY;
  80. }
  81. protected int minX() {
  82. return (startX <= endX) ? startX : endX;
  83. }
  84. protected int maxY() {
  85. return (startY >= endY) ? startY : endY;
  86. }
  87. protected int minY() {
  88. return (startY <= endY) ? startY : endY;
  89. }
  90. public void setStroke(float x) {
  91. stroke = x;
  92. }
  93. public void getStroke(float x) {
  94. stroke = x;
  95. }
  96. public boolean isContain(int x, int y) {
  97. if (x >= minX() && x <= maxX() && y >= minY() && y <= maxY())
  98. return true;
  99. else
  100. return false;
  101. }
  102. public void writeData(PrintWriter out) throws IOException {
  103. int fill, rgb;
  104. rgb = color.getRGB();
  105. fill = isFill ? 1 : 0;
  106. out.println(startX + "|" + startY + "|" + endX + "|" + endY + "|"
  107. + fill + "|" + rgb + "|" + shape);
  108. }
  109. public void readData(BufferedReader in) throws IOException {
  110. String s = in.readLine();
  111. StringTokenizer t = new StringTokenizer(s, "|");
  112. startX = Integer.parseInt(t.nextToken());
  113. startY = Integer.parseInt(t.nextToken());
  114. endX = Integer.parseInt(t.nextToken());
  115. endY = Integer.parseInt(t.nextToken());
  116. isFill = (Integer.parseInt(t.nextToken()) == 1) ? true : false;
  117. color = new Color(Integer.parseInt(t.nextToken()));
  118. shape = Integer.parseInt(t.nextToken());
  119. isSelected = false;
  120. }
  121. }
  122. /*
  123.  * 类名:直线 描述:用来构造直线,继承基类坐标构建方法 是否包含的属性中对直线做矩形对角线处理
  124.  */
  125. class Line extends Shape {
  126. public Line() {
  127. super();
  128. shape = LINE;
  129. }
  130. public Line(int sx, int sy, int ex, int ey) {
  131. super(sx, sy, ex, ey);
  132. shape = LINE;
  133. }
  134. public boolean isContain(int x, int y) {
  135. double c = Math.sqrt((endX - startX) * (endX - startX)
  136. + (endY - startY) * (endY - startY));
  137. double c1 = Math.sqrt((x - startX) * (x - startX) + (y - startY)
  138. * (y - startY));
  139. double c2 = Math
  140. .sqrt((x - endX) * (x - endX) + (y - endY) * (y - endY));
  141. if (c1 + c2 - c <= 0.25 * c)
  142. return true;
  143. else
  144. return false;
  145. }
  146. }
  147. /*
  148.  * 类名:矩形 描述:此类用于构建矩形,继承基类坐标构建方法 是否包含的属性中看点是否在矩形内部
  149.  */
  150. class Square extends Shape {
  151. public Square() {
  152. super();
  153. shape = SQUARE;
  154. }
  155. public Square(int sx, int sy, int ex, int ey) {
  156. super(sx, sy, ex, ey);
  157. shape = SQUARE;
  158. }
  159. public boolean isContain(int x, int y) {
  160. if (x >= minX() && x <= maxX() && y >= minY() && y <= maxY())
  161. return true;
  162. else
  163. return false;
  164. }
  165. }
  166. /*
  167.  * 类名:椭圆 描述:此类用于构建椭圆,继承基类坐标构建方法 是否包含的属性中看椭圆是否在外切矩形中
  168.  */
  169. class Ellipse extends Shape {
  170. public Ellipse() {
  171. super();
  172. shape = ELLIPSE;
  173. }
  174. public Ellipse(int sx, int sy, int ex, int ey) {
  175. super(sx, sy, ex, ey);
  176. shape = ELLIPSE;
  177. }
  178. public boolean isContain(int x, int y) {
  179. double dx = (double) (startX + endX) / 2;
  180. double dy = (double) (startY + endY) / 2;
  181. double a = (maxX() - minX()) / 2;
  182. double b = (maxY() - minY()) / 2;
  183. double x1 = (x - dx) * (x - dx) / (a * a);
  184. double y1 = (y - dy) * (y - dy) / (b * b);
  185. if (x1 + y1 <= 1)
  186. return true;
  187. else
  188. return false;
  189. }
  190. }
  191. /*
  192.  * 类名:圆 描述:此类用于构建圆,继承基类坐标构建方法,是否包含的属性中与椭圆类似 采用椭圆画法,将椭圆长短轴统一
  193.  */
  194. class Round extends Shape {
  195. public Round() {
  196. super();
  197. shape = ROUND;
  198. }
  199. public Round(int sx, int sy, int ex, int ey) {
  200. super(sx, sy, ex, ey);
  201. shape = ROUND;
  202. }
  203. public boolean isContain(int x, int y) {
  204. double dx = (double) (startX + endX) / 2;
  205. double dy = (double) (startY + endY) / 2;
  206. double a = (maxX() - minX()) / 2;
  207. double b = (maxY() - minY()) / 2;
  208. double x1 = (x - dx) * (x - dx) / (a * a);
  209. double y1 = (y - dy) * (y - dy) / (b * b);
  210. if (x1 + y1 <= 1)
  211. return true;
  212. else
  213. return false;
  214. }
  215. public void change() {
  216. int temp;
  217. if (startX > endX) {
  218. temp = startX;
  219. startX = endX;
  220. endX = temp;
  221. }
  222. if (startY > endY) {
  223. temp = startY;
  224. startY = endY;
  225. endY = temp;
  226. }
  227. if ((endX - startX) > (endY - startY)) {
  228. endY = startY + endX - startX;
  229. } else {
  230. endX = startX + endY - startY;
  231. }
  232. }
  233. public Point2D getStart() {
  234. return new Point2D.Double(startX, startY);
  235. }
  236. public Point2D getEnd() {
  237. if (startX > endX && startY > endY) {
  238. if ((endX - startX) < (endY - startY)) {
  239. endY = startY + endX - startX;
  240. } else {
  241. endX = startX + endY - startY;
  242. }
  243. } else if (startX < endX && startY < endY) {
  244. if ((endX - startX) < (endY - startY)) {
  245. endX = startX + endY - startY;
  246. } else {
  247. endY = startY + endX - startX;
  248. }
  249. } else if (startX > endX && startY < endY) {
  250. if ((startX - endX) < (endY - startY)) {
  251. endX = startX - endY + startY;
  252. } else {
  253. endY = startY + startX - endX;
  254. }
  255. } else if (startX < endX && startY > endY) {
  256. if ((endX - startX) < (startY - endY)) {
  257. endX = startX + startY - endY;
  258. } else {
  259. endY = startY - startX + endX;
  260. }
  261. }
  262. return new Point2D.Double(endX, endY);
  263. }
  264. }
  265. /*
  266.  * 类名:画笔 描述:此类用于构建画笔,继承基类坐标构建方法 重定义基类中的线宽属性
  267.  */
  268. class Pen extends Shape {
  269. public Pen() {
  270. super();
  271. shape = PEN;
  272. }
  273. public Pen(int sx, int sy, int ex, int ey) {
  274. super(sx, sy, ex, ey);
  275. shape = PEN;
  276. }
  277. public float stroke = PENSTROKE;
  278. }
  279. /*
  280.  * 类名:橡皮擦 描述:此类用于构建橡皮擦,继承基类坐标构建方法 重定义基类中的线宽属性
  281.  */
  282. class Eraser extends Shape {
  283. public Eraser() {
  284. super();
  285. shape = ERASER;
  286. }
  287. public Eraser(int sx, int sy, int ex, int ey) {
  288. super(sx, sy, ex, ey);
  289. shape = ERASER;
  290. }
  291. public float stroke = ERASERSTROKE;
  292. }
  293. /*
  294.  * 类名:确定坐标图形 描述:此类用于构建确定坐标图形,继承基类坐标构建方法 给出点的坐标,按类型精确画图
  295.  */
  296. class Acuteshape extends Shape {
  297. public Acuteshape() {
  298. super();
  299. shape = ACUTESHAPE;
  300. }
  301. public Acuteshape(int sx, int sy, int ex, int ey) {
  302. super(sx, sy, ex, ey);
  303. shape = ACUTESHAPE;
  304. }
  305. public void setStart(int x, int y) {
  306. startX = x;
  307. startY = y;
  308. }
  309. public void setEnd(int x, int y) {
  310. endX = x;
  311. endY = y;
  312. }
  313. }
  314. class Word extends Shape {
  315. public Word() {
  316. super();
  317. shape = WORD;
  318. }
  319. public Word(int sx, int sy, int ex, int ey) {
  320. super(sx, sy, ex, ey);
  321. shape = WORD;
  322. }
  323. protected String s1;
  324. protected String s2 = "Arial";
  325. }
  326. /*
  327.  * 类名:按钮面板 描述:用于构建画图板上所有按钮,每个按钮均有响应注释
  328.  */
  329. class ButtonPanel extends JPanel {
  330. JButton penButton = new JButton("Pen");
  331. JButton eraserButton = new JButton("Eraser");
  332. JButton cusorButton = new JButton("Move");
  333. JButton lineButton = new JButton("Line");
  334. JButton squareButton = new JButton("Square");
  335. JButton ellipseButton = new JButton("Ellipse");
  336. JButton roundButton = new JButton("Round");
  337. JButton colorButton = new JButton("Color");
  338. JButton fillButton = new JButton("Fill");
  339. JButton drawButton = new JButton("Draw");
  340. JButton setStrokeButton = new JButton("Stroke");
  341. JButton acuteButton = new JButton("AccutePaint");
  342. JButton wordButton = new JButton("Word");
  343. JButton wordSetting = new JButton("FontSetting");
  344. public ButtonPanel() {
  345. setLayout(new GridLayout(2, 6));
  346. penButton.setToolTipText("Drawing with a pen");
  347. eraserButton.setToolTipText("Use eraser to wipe out");
  348. cusorButton.setToolTipText("Move the shape");
  349. lineButton.setToolTipText("Draw a line");
  350. squareButton.setToolTipText("Draw a rectangle");
  351. ellipseButton.setToolTipText("Draw a ecllipse");
  352. roundButton.setToolTipText("Draw a round");
  353. colorButton.setToolTipText("Choose the draw color");
  354. fillButton.setToolTipText("Fill shape");
  355. drawButton.setToolTipText("Draw shape");
  356. setStrokeButton.setToolTipText("Set line stroke");
  357. acuteButton.setToolTipText("draw an accurte paint");
  358. wordButton.setToolTipText("Input a word");
  359. wordSetting.setToolTipText("Setting word style");
  360. add(penButton);
  361. add(eraserButton);
  362. add(cusorButton);
  363. add(lineButton);
  364. add(squareButton);
  365. add(ellipseButton);
  366. add(roundButton);
  367. add(colorButton);
  368. add(fillButton);
  369. add(drawButton);
  370. add(setStrokeButton);
  371. add(acuteButton);
  372. add(wordButton);
  373. add(wordSetting);
  374. }
  375. }
  376. /*
  377.  * 类名:画图面板 描述:包含当前所画图形的所有信息和动作监听器,用于画图
  378.  */
  379. class PaintPanel extends JPanel {
  380. private int currentShape; // 当前形状
  381. private boolean currentFill; // 当前图形填充状态
  382. static float currentstroke; // 当前线宽
  383. static float penstroke;
  384. static float eraserstroke;
  385. private Color currentColor; // 当前前景色
  386. private Color currentBackColor;// 当前背景色
  387. private boolean paintEnabled; // 画图使能
  388. private ArrayList polygon; // 图形容器
  389. private int moveX, moveY; // 移动后的坐标
  390. private int currentX, currentY; // 当前坐标
  391. private int f1, f2; // 用来存放当前字体风格
  392. public static String style1;// 用来存放当前字体
  393. public static int num;// 当前字体大小
  394. public static int acutesx,acutesy;
  395. public static int acuteex,acuteey;
  396. public PaintPanel() {
  397. paintEnabled = false;
  398. currentFill = false;
  399. currentstroke = 2.0f;
  400. penstroke = 3.0f;
  401. eraserstroke = 10.0f;
  402. currentColor = Color.BLACK;
  403. currentBackColor = Color.WHITE;
  404. style1 = "Arial";
  405. num = 30;// 初始化各量
  406. polygon = new ArrayList(25);
  407. setLayout(new BorderLayout());
  408. ButtonPanel buttonPanel = new ButtonPanel();// 创建按钮对象
  409. add(buttonPanel, BorderLayout.NORTH);
  410. // 按钮面板置于上部
  411. add(new LabelPanel(), BorderLayout.SOUTH);
  412. // 标签栏置于底部
  413. addMouseListener(new MouseHandler());
  414. addMouseMotionListener(new MouseMotionHandler());
  415. // 鼠标监听器
  416. /*
  417.  * 以下语句用于监听各个按钮动作,改变响应相应的值,如当前形状
  418.  */
  419. buttonPanel.cusorButton.addActionListener(new ActionListener() {
  420. public void actionPerformed(ActionEvent e) {
  421. paintEnabled = false;
  422. setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
  423. }
  424. });
  425. buttonPanel.penButton.addActionListener(new ActionListener() {
  426. public void actionPerformed(ActionEvent e) {
  427. paintEnabled = true;
  428. setCursor(Cursor.getDefaultCursor());
  429. currentShape = Shape.PEN;
  430. }
  431. });
  432. buttonPanel.eraserButton.addActionListener(new ActionListener() {
  433. public void actionPerformed(ActionEvent e) {
  434. paintEnabled = true;
  435. setCursor(Cursor.getDefaultCursor());
  436. currentShape = Shape.ERASER;
  437. }
  438. });
  439. buttonPanel.lineButton.addActionListener(new ActionListener() {
  440. public void actionPerformed(ActionEvent e) {
  441. paintEnabled = true;
  442. setCursor(Cursor.getDefaultCursor());
  443. currentShape = Shape.LINE;
  444. }
  445. });
  446. buttonPanel.squareButton.addActionListener(new ActionListener() {
  447. public void actionPerformed(ActionEvent e) {
  448. paintEnabled = true;
  449. setCursor(Cursor.getDefaultCursor());
  450. currentShape = Shape.SQUARE;
  451. }
  452. });
  453. buttonPanel.ellipseButton.addActionListener(new ActionListener() {
  454. public void actionPerformed(ActionEvent e) {
  455. paintEnabled = true;
  456. setCursor(Cursor.getDefaultCursor());
  457. currentShape = Shape.ELLIPSE;
  458. }
  459. });
  460. buttonPanel.roundButton.addActionListener(new ActionListener() {
  461. public void actionPerformed(ActionEvent e) {
  462. paintEnabled = true;
  463. setCursor(Cursor.getDefaultCursor());
  464. currentShape = Shape.ROUND;
  465. }
  466. });
  467. buttonPanel.fillButton.addActionListener(new ActionListener() {
  468. public void actionPerformed(ActionEvent e) {
  469. paintEnabled = true;
  470. setCursor(Cursor.getDefaultCursor());
  471. currentFill = true;
  472. }
  473. });
  474. buttonPanel.drawButton.addActionListener(new ActionListener() {
  475. public void actionPerformed(ActionEvent e) {
  476. paintEnabled = true;
  477. setCursor(Cursor.getDefaultCursor());
  478. currentFill = false;
  479. }
  480. });
  481. buttonPanel.colorButton.addActionListener(new ActionListener() {
  482. public void actionPerformed(ActionEvent e) {
  483. Color defaultColor = Color.BLACK;
  484. Color selected = JColorChooser.showDialog(PaintPanel.this,
  485. "Change Color", defaultColor);
  486. currentColor = selected;
  487. }
  488. });
  489. buttonPanel.wordButton.addActionListener(new ActionListener() {
  490. public void actionPerformed(ActionEvent e) {
  491. paintEnabled = true;
  492. setCursor(Cursor.getDefaultCursor());
  493. currentShape = Shape.WORD;
  494. }
  495. });
  496. buttonPanel.setStrokeButton.addActionListener(new ActionListener() {
  497. public void actionPerformed(ActionEvent e) {
  498. StrokeFrame stroke = new StrokeFrame();
  499. stroke.setVisible(true);
  500. currentstroke = stroke.a;
  501. penstroke = stroke.b;
  502. eraserstroke = stroke.c;
  503. stroke.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  504. }
  505. });
  506. buttonPanel.acuteButton.addActionListener(new ActionListener() {
  507. public void actionPerformed(ActionEvent e) {
  508. AcuteFrame acute = new AcuteFrame();
  509. acute.setVisible(true);
  510. //Shape temp = new Shape();
  511. //temp.setStart(acute.sx, acute.sy);
  512. //temp.setEnd(acute.ex, acute.ey);
  513. currentShape = acute.currentshape;
  514. //polygon.add(temp);
  515. acute.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  516. }
  517. });
  518. buttonPanel.wordSetting.addActionListener(new ActionListener() {
  519. public void actionPerformed(ActionEvent e) {
  520. FontSetting Font = new FontSetting();
  521. Font.setVisible(true);
  522. // num = Font.number;
  523. // style1 = Font.s2;
  524. Font.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  525. }
  526. });
  527. }
  528. /*
  529.  * 画图组件,构建画笔进行画图
  530.  */
  531. public void paintComponent(Graphics g) {
  532. super.paintComponent(g);
  533. Graphics2D g2 = (Graphics2D) g; // 定义画笔
  534. int w = getWidth();
  535. int h = getHeight();
  536. Rectangle2D scale = new Rectangle2D.Double(0, 0, w, h);
  537. g2.setColor(currentBackColor);
  538. g2.fill(scale); // 画出主框架
  539. // 采用2D图形方法分别进行画图
  540. for (int i = 0; i < polygon.size(); i++) {
  541. Shape temp = (Shape) polygon.get(i);
  542. g2.setColor(temp.color);
  543. switch (temp.shape) {
  544. case Shape.PEN:
  545. Line2D showLine = new Line2D.Double(temp.getStart(), temp
  546. .getEnd());
  547. g2.setStroke(new BasicStroke(penstroke, BasicStroke.CAP_ROUND,
  548. BasicStroke.JOIN_BEVEL));
  549. g2.draw(showLine);
  550. break;
  551. case Shape.ERASER:
  552. Line2D showLine1 = new Line2D.Double(temp.getStart(), temp
  553. .getEnd());
  554. g2.setColor(currentBackColor);
  555. g2.setStroke(new BasicStroke(eraserstroke,
  556. BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
  557. g2.draw(showLine1);
  558. break;
  559. case Shape.LINE:
  560. Line2D showLine2 = new Line2D.Double(temp.getStart(), temp
  561. .getEnd());
  562. g2.setStroke(new BasicStroke(currentstroke,
  563. BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
  564. g2.draw(showLine2);
  565. break;
  566. case Shape.SQUARE:
  567. Rectangle2D showSquare = new Rectangle2D.Double();
  568. showSquare.setFrameFromDiagonal(temp.getStart(), temp.getEnd());
  569. g2.setStroke(new BasicStroke(currentstroke));
  570. if (temp.isFill)
  571. g2.fill(showSquare);
  572. else
  573. g2.draw(showSquare);
  574. break;
  575. case Shape.ELLIPSE:
  576. Ellipse2D showEllipse = new Ellipse2D.Double();
  577. showEllipse
  578. .setFrameFromDiagonal(temp.getStart(), temp.getEnd());
  579. g2.setStroke(new BasicStroke(currentstroke));
  580. if (temp.isFill)
  581. g2.fill(showEllipse);
  582. else
  583. g2.draw(showEllipse);
  584. break;
  585. case Shape.ROUND:
  586. Ellipse2D showRound = new Ellipse2D.Double();
  587. showRound.setFrameFromDiagonal(temp.getStart(), temp.getEnd());
  588. g2.setStroke(new BasicStroke(currentstroke));
  589. if (temp.isFill)
  590. g2.fill(showRound);
  591. else
  592. g2.draw(showRound);
  593. break;
  594. case Shape.WORD:
  595. Font word = new Font(style1, Font.PLAIN, num);
  596. g2.setFont(word);
  597. if (temp.s1 != null)
  598. g2.drawString(temp.s1, temp.startX, temp.startY);
  599. break;
  600. case Shape.ACUTELINE:
  601. temp.setStart(acutesx, acutesy);
  602. temp.setEnd(acuteex, acuteey);
  603. Line2D showLine3 = new Line2D.Double(temp.getStart(), temp
  604. .getEnd());
  605. g2.setStroke(new BasicStroke(currentstroke,
  606. BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
  607. g2.draw(showLine3);
  608. break;
  609. case Shape.ACUTESQUARE:
  610. temp.setStart(acutesx, acutesy);
  611. temp.setEnd(acuteex, acuteey);
  612. Rectangle2D showSquare2 = new Rectangle2D.Double();
  613. showSquare2.setFrameFromDiagonal(temp.getStart(), temp.getEnd());
  614. g2.setStroke(new BasicStroke(currentstroke));
  615. if (temp.isFill)
  616. g2.fill(showSquare2);
  617. else
  618. g2.draw(showSquare2);
  619. break;
  620. case Shape.ACUTEELLIPSE:
  621. temp.setStart(acutesx, acutesy);
  622. temp.setEnd(acuteex, acuteey);
  623. Ellipse2D showEllipse2 = new Ellipse2D.Double();
  624. showEllipse2
  625. .setFrameFromDiagonal(temp.getStart(), temp.getEnd());
  626. g2.setStroke(new BasicStroke(currentstroke));
  627. if (temp.isFill)
  628. g2.fill(showEllipse2);
  629. else
  630. g2.draw(showEllipse2);
  631. break;
  632. case Shape.ACUTEROUND:
  633. temp.setStart(acutesx, acutesy);
  634. temp.setEnd(acuteex, acuteey);
  635. Ellipse2D showRound2 = new Ellipse2D.Double();
  636. showRound2.setFrameFromDiagonal(temp.getStart(), temp.getEnd());
  637. g2.setStroke(new BasicStroke(currentstroke));
  638. if (temp.isFill)
  639. g2.fill(showRound2);
  640. else
  641. g2.draw(showRound2);
  642. break;
  643. }
  644. }
  645. }
  646. public void setBackColor(Color color) {
  647. currentBackColor = color;
  648. }
  649. public void setForeColor(Color color) {
  650. currentColor = color;
  651. }
  652. public void setStroke(float y) {
  653. currentstroke = y;
  654. }
  655. public void setPenStroke(float y) {
  656. penstroke = y;
  657. }
  658. public void setEraserStroke(float y) {
  659. eraserstroke = y;
  660. }
  661. public void setDraw() {
  662. currentFill = false;
  663. }
  664. public void setFill() {
  665. currentFill = true;
  666. }
  667. public void writeShapes(String file) {
  668. try {
  669. PrintWriter out = new PrintWriter(new FileWriter(file));
  670. out.println(polygon.size());
  671. out.println(getWidth() + "|" + getHeight() + "|"
  672. + currentBackColor.getRGB());
  673. for (int i = 0; i < polygon.size(); i++)
  674. ((Shape) (polygon.get(i))).writeData(out);
  675. out.close();
  676. } catch (IOException exception) {
  677. exception.printStackTrace();
  678. }
  679. }
  680. /*
  681.  * 从文件中读入图形,并把当前容器清空
  682.  */
  683. public void readShapes(String file) {
  684. try {
  685. BufferedReader in = new BufferedReader(new FileReader(file));
  686. int size = Integer.parseInt(in.readLine());
  687. String back = in.readLine();
  688. StringTokenizer t = new StringTokenizer(back, "|");
  689. int w = Integer.parseInt(t.nextToken());
  690. int h = Integer.parseInt(t.nextToken());
  691. currentBackColor = new Color(Integer.parseInt(t.nextToken()));
  692. polygon.clear();
  693. Shape temp;
  694. for (int i = 0; i < size; i++) {
  695. temp = new Shape();
  696. temp.readData(in);
  697. polygon.add(temp);
  698. }
  699. setSize(w, h);
  700. in.close();
  701. } catch (IOException exception) {
  702. exception.printStackTrace();
  703. }
  704. }
  705. /*
  706.  * 类名:标签面板 描述:用于显示当前坐标
  707.  */
  708. private class LabelPanel extends JPanel {
  709. JLabel label;
  710. public LabelPanel() {
  711. label = new JLabel("Current X: " + currentX + "     Current Y: "
  712. + currentY);
  713. add(label);
  714. }
  715. public void paintComponent(Graphics g) {
  716. super.paintComponent(g);
  717. label.setText("Current X: " + currentX + "     Current Y: "
  718. + currentY);
  719. }
  720. }
  721. /*
  722.  * 类名:鼠标操作 
  723.  * 描述:继承了MouseAdapter,用来完成鼠标相应事件操作
  724.  */
  725. private class MouseHandler extends MouseAdapter {
  726. private int tempX;
  727. private int tempY;
  728. public int index = 0;
  729. private Shape temp;// 临时形状存储
  730. public Shape[] itemList = new Shape[5000];// 画笔和橡皮擦使用的形状记录容器
  731. public void mousePressed(MouseEvent event) {
  732. tempX = event.getX();
  733. tempY = event.getY();
  734. currentX = tempX;
  735. currentY = tempY;// 获得鼠标点击时的坐标
  736. int isLeft = event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK;
  737. int isRight = event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK;
  738. if (paintEnabled && currentShape == Shape.PEN) {
  739. itemList[index] = new Pen();
  740. itemList[index].color = currentColor;
  741. itemList[index].setStart(tempX, tempY);
  742. itemList[index].setEnd(tempX, tempY);
  743. polygon.add(itemList[index]);
  744. index++;
  745. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  746. }// 若是画笔,则记录点击时的点坐标
  747. else if (paintEnabled && currentShape == Shape.ERASER) {
  748. itemList[index] = new Eraser();
  749. itemList[index].color = currentBackColor;
  750. itemList[index].setStart(tempX, tempY);
  751. itemList[index].setEnd(tempX, tempY);
  752. polygon.add(itemList[index]);
  753. index++;
  754. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  755. } // 若是橡皮擦,则记录点击时的点坐标
  756. else if (isLeft != 0 && paintEnabled && currentShape == Shape.WORD) {
  757. itemList[index] = new Word();
  758. itemList[index].color = currentColor;
  759. itemList[index].setStart(event.getX(), event.getY());
  760. itemList[index].setEnd(event.getX(), event.getY());
  761. itemList[index].s1 = (String) JOptionPane.showInputDialog(null,
  762. "Please input the text you want!");
  763. polygon.add(itemList[index]);
  764. index++;
  765. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  766. }// 对文字类形状进行处理
  767. else if (isLeft != 0 && paintEnabled) {
  768. switch (currentShape) {
  769. case Shape.LINE:
  770. temp = new Line();
  771. break;
  772. case Shape.SQUARE:
  773. temp = new Square();
  774. break;
  775. case Shape.ELLIPSE:
  776. temp = new Ellipse();
  777. break;
  778. case Shape.ROUND:
  779. temp = new Round();
  780. break;
  781. case Shape.ACUTELINE:
  782. temp = new Line();
  783. break;
  784. case Shape.ACUTESQUARE:
  785. temp = new Square();
  786. break;
  787. case Shape.ACUTEELLIPSE:
  788. temp = new Ellipse();
  789. break;
  790. case Shape.ACUTEROUND:
  791. temp = new Round();
  792. break;
  793. default:
  794. temp = new Line();
  795. }
  796. temp.setStart(tempX, tempY);
  797. temp.setEnd(tempX, tempY);
  798. temp.color = currentColor;
  799. temp.isFill = currentFill;
  800. polygon.add(temp);
  801. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  802. }// 对其他类的形状,保存坐标,加入形状容器
  803. else if (isLeft != 0 && !paintEnabled) {
  804. int size = polygon.size();
  805. setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
  806. for (int i = 0; i < size; i++) {
  807. temp = (Shape) polygon.get(i);
  808. if (temp.isContain(tempX, tempY))
  809. temp.isSelected = true;
  810. }
  811. moveX = tempX;
  812. moveY = tempY;
  813. } else if (isRight != 0) {
  814. for (int i = 0; i < polygon.size(); i++) {
  815. temp = (Shape) polygon.get(i);
  816. if (temp.isContain(tempX, tempY)) {
  817. polygon.remove(i);
  818. i--;
  819. }
  820. //将位置所占的图形除去
  821. }
  822. repaint();//重画
  823. }
  824. }
  825. /*
  826.  * 鼠标松开的动作,直线、矩形、椭圆在此时得到终点坐标,画笔橡皮停止记录笔的轨迹
  827.  */
  828. public void mouseReleased(MouseEvent event) {
  829. tempX = event.getX();
  830. tempY = event.getY();
  831. currentX = tempX;
  832. currentY = tempY;
  833. int isLeft = event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK;
  834. if (isLeft != 0 && paintEnabled && currentShape == Shape.PEN) {
  835. itemList[index] = new Pen();
  836. itemList[index].color = currentColor;
  837. itemList[index].setStart(event.getX(), event.getY());
  838. itemList[index].setEnd(event.getX(), event.getY());
  839. polygon.add(itemList[index]);
  840. index++;
  841. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  842. } else if (isLeft != 0 && paintEnabled
  843. && currentShape == Shape.ERASER) {
  844. itemList[index] = new Eraser();
  845. itemList[index].color = currentBackColor;
  846. itemList[index].setStart(event.getX(), event.getY());
  847. itemList[index].setEnd(event.getX(), event.getY());
  848. polygon.add(itemList[index]);
  849. index++;
  850. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  851. } else if (isLeft != 0 && paintEnabled
  852. && currentShape == Shape.WORD) {
  853. itemList[index] = new Word();
  854. itemList[index].color = currentColor;
  855. itemList[index].setStart(event.getX(), event.getY());
  856. itemList[index].setEnd(event.getX(), event.getY());
  857. itemList[index].s1 = JOptionPane
  858. .showInputDialog("Please input the text you want!");
  859. polygon.add(itemList[index]);
  860. index++;
  861. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  862. } else if (isLeft != 0 && paintEnabled) {
  863. temp = (Shape) polygon.get(polygon.size() - 1);
  864. temp.setEnd(tempX, tempY);
  865. }
  866. else if (!paintEnabled) {
  867. int size = polygon.size();
  868. setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
  869. for (int i = 0; i < size; i++) {
  870. temp = (Shape) polygon.get(i);
  871. temp.isSelected = false;
  872. }
  873. } else
  874. setCursor(Cursor.getDefaultCursor());
  875. }
  876. }
  877. /*
  878.  * 类名:鼠标动作执行
  879.  * 描述:捕捉鼠标移动和拖拽的位置,直线、矩形、椭圆实时重画,画笔和橡皮记录鼠标拖拽的位置
  880.  */
  881. private class MouseMotionHandler implements MouseMotionListener {
  882. private int tempX;
  883. private int tempY;
  884. public int index = 0;
  885. private Shape temp;
  886. public Shape[] itemList = new Shape[5000];
  887. public void mouseMoved(MouseEvent event) {
  888. currentX = event.getX();
  889. currentY = event.getY();
  890. repaint();
  891. }
  892. public void mouseDragged(MouseEvent event) {
  893. tempX = event.getX();
  894. tempY = event.getY();
  895. currentX = tempX;
  896. currentY = tempY;
  897. int isLeft = event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK;
  898. int isRight = event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK;
  899. if (paintEnabled && currentShape == Shape.PEN) {
  900. itemList[index] = new Pen();
  901. itemList[index].color = currentColor;
  902. itemList[index].setStart(event.getX(), event.getY());
  903. itemList[index].setEnd(event.getX(), event.getY());
  904. polygon.add(itemList[index]);
  905. index++;
  906. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  907. } else if (paintEnabled && currentShape == Shape.ERASER) {
  908. itemList[index] = new Eraser();
  909. itemList[index].color = currentBackColor;
  910. itemList[index].setStart(event.getX(), event.getY());
  911. itemList[index].setEnd(event.getX(), event.getY());
  912. polygon.add(itemList[index]);
  913. index++;
  914. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  915. } else if (isLeft != 0 && paintEnabled
  916. && currentShape == Shape.WORD) {
  917. itemList[index] = new Word();
  918. itemList[index].color = currentColor;
  919. itemList[index].setStart(event.getX(), event.getY());
  920. itemList[index].setEnd(event.getX(), event.getY());
  921. String input;
  922. input = JOptionPane
  923. .showInputDialog("Please input the text you want!");
  924. polygon.add(itemList[index]);
  925. index++;
  926. setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  927. } else if (isLeft != 0 && paintEnabled) {
  928. int size = polygon.size();
  929. temp = (Shape) polygon.get(size - 1);
  930. temp.setEnd(tempX, tempY);
  931. } else if (isLeft != 0 && !paintEnabled) {
  932. int size = polygon.size();
  933. int x1, y1, x2, y2;
  934. for (int i = 0; i < size; i++) {
  935. temp = (Shape) polygon.get(i);
  936. if (temp.isSelected) {
  937. x1 = (int) temp.getStart().getX() + (tempX - moveX);
  938. y1 = (int) temp.getStart().getY() + (tempY - moveY);
  939. x2 = (int) temp.getEnd().getX() + (tempX - moveX);
  940. y2 = (int) temp.getEnd().getY() + (tempY - moveY);
  941. temp.setStart(x1, y1);
  942. temp.setEnd(x2, y2);
  943. }
  944. moveX = tempX;
  945. moveY = tempY;//对选定的图形进行移动
  946. }
  947. }
  948. repaint();
  949. }
  950. }
  951. }
  952. /*
  953.  * 类名:主框架
  954.  * 描述:主框架的大小布局,画图面板的位置,菜单栏的构建
  955.  */
  956. class PaintFrame extends JFrame {
  957. PaintPanel paintPanel;
  958. JMenuItem backItem;
  959. JMenuItem foreItem;
  960. JRadioButtonMenuItem draw;
  961. JRadioButtonMenuItem fill;
  962. public PaintFrame() {
  963. setTitle("java painting");
  964. setBounds(150, 150, 800, 500);
  965. paintPanel = new PaintPanel();
  966. getContentPane().add(paintPanel);
  967. JMenuBar menuBar = makeMenuBar();
  968. setJMenuBar(menuBar);
  969. backItem.addActionListener(new ActionListener() {
  970. public void actionPerformed(ActionEvent e) {
  971. Color defaultColor = Color.WHITE;
  972. Color selected = JColorChooser.showDialog(PaintFrame.this,
  973. "Background Color", defaultColor);
  974. paintPanel.setBackColor(selected);
  975. }
  976. });//前景色设置
  977. foreItem.addActionListener(new ActionListener() {
  978. public void actionPerformed(ActionEvent e) {
  979. Color defaultColor = Color.BLACK;
  980. Color selected = JColorChooser.showDialog(PaintFrame.this,
  981. "Change ForeColor", defaultColor);
  982. paintPanel.setForeColor(selected);
  983. }
  984. });//背景色设置
  985. draw.addActionListener(new ActionListener() {
  986. public void actionPerformed(ActionEvent e) {
  987. paintPanel.setDraw();
  988. }
  989. });
  990. fill.addActionListener(new ActionListener() {
  991. public void actionPerformed(ActionEvent e) {
  992. paintPanel.setFill();
  993. }
  994. });//填充图设置
  995. }
  996. /*
  997.  * 类名:菜单栏
  998.  * 描述:构建主框架的菜单栏,有文件的新建、打开、保存,颜色设置,填充画,帮助、声明
  999.  */
  1000. private JMenuBar makeMenuBar() {
  1001. JMenuBar menuBar = new JMenuBar();
  1002. JMenu fileMenu = new JMenu("File");
  1003. fileMenu.setMnemonic('F');
  1004. menuBar.add(fileMenu);
  1005. JMenuItem newItem = new JMenuItem("New", 'N');
  1006. newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
  1007. InputEvent.CTRL_MASK));
  1008. newItem.addActionListener(new ActionListener() {
  1009. @SuppressWarnings("deprecation")
  1010. public void actionPerformed(ActionEvent e) {
  1011. PaintFrame frame = new PaintFrame();
  1012. frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  1013. frame.show();
  1014. }
  1015. });
  1016. fileMenu.add(newItem);//新建文件
  1017. JMenuItem openItem = new JMenuItem("Open", 'O');
  1018. openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
  1019. InputEvent.CTRL_MASK));
  1020. openItem.addActionListener(new ActionListener() {
  1021. public void actionPerformed(ActionEvent e) {
  1022. JFileChooser chooser = new JFileChooser();
  1023. chooser.setCurrentDirectory(new File("."));
  1024. chooser.addChoosableFileFilter(new MyFilter());
  1025. int result = chooser.showOpenDialog(PaintFrame.this);
  1026. if (result == JFileChooser.APPROVE_OPTION) {
  1027. String file = chooser.getSelectedFile().getName();
  1028. paintPanel.readShapes(file);
  1029. }
  1030. }
  1031. });
  1032. fileMenu.add(openItem);//打开文件
  1033. JMenuItem saveItem = new JMenuItem("Save", 'O');
  1034. saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
  1035. InputEvent.CTRL_MASK));
  1036. saveItem.addActionListener(new ActionListener() {
  1037. public void actionPerformed(ActionEvent e) {
  1038. JFileChooser chooser = new JFileChooser();
  1039. chooser.setCurrentDirectory(new File("."));
  1040. chooser.addChoosableFileFilter(new MyFilter());
  1041. int result = chooser.showSaveDialog(PaintFrame.this);
  1042. if (result == JFileChooser.APPROVE_OPTION) {
  1043. String file = chooser.getSelectedFile().getName();
  1044. paintPanel.writeShapes(file);
  1045. }
  1046. }
  1047. });
  1048. fileMenu.add(saveItem);//保存文件
  1049. fileMenu.addSeparator();
  1050. JMenuItem exitItem = new JMenuItem("Exit", 'x');
  1051. exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
  1052. InputEvent.CTRL_MASK));
  1053. exitItem.addActionListener(new ActionListener() {
  1054. public void actionPerformed(ActionEvent event) {
  1055. System.exit(0);
  1056. }
  1057. });
  1058. fileMenu.add(exitItem);//退出程序
  1059. JMenu setMenu = new JMenu("Settings");
  1060. setMenu.setMnemonic('S');
  1061. menuBar.add(setMenu);
  1062. backItem = new JMenuItem("Background", 'B');
  1063. setMenu.add(backItem);
  1064. foreItem = new JMenuItem("ForColor", 'C');
  1065. setMenu.add(foreItem);//颜色设置
  1066. ButtonGroup group = new ButtonGroup();
  1067. draw = new JRadioButtonMenuItem("Draw", true);
  1068. fill = new JRadioButtonMenuItem("Fill", false);
  1069. group.add(draw);
  1070. group.add(fill);
  1071. JMenu style = new JMenu("Style");
  1072. style.add(draw);
  1073. style.add(fill);
  1074. setMenu.add(style);//填充画设置
  1075. JMenu helpMenu = new JMenu("Help");
  1076. helpMenu.setMnemonic('H');
  1077. menuBar.add(helpMenu);
  1078. JMenuItem helpItem = new JMenuItem("Help", 'H');
  1079. helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,
  1080. InputEvent.CTRL_MASK));
  1081. helpItem.addActionListener(new ActionListener() {
  1082. public void actionPerformed(ActionEvent event) {
  1083. HelpFrame help = new HelpFrame();
  1084. help.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  1085. help.show();
  1086. }
  1087. });
  1088. helpMenu.add(helpItem);
  1089. JMenuItem aboutItem = new JMenuItem("About", 'A');
  1090. aboutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
  1091. InputEvent.CTRL_MASK));
  1092. aboutItem.addActionListener(new ActionListener() {
  1093. public void actionPerformed(ActionEvent event) {
  1094. JOptionPane
  1095. .showMessageDialog(
  1096. PaintFrame.this,
  1097. " JavaPaint nn"
  1098. + "Author :  Jianwen Sun(Keven) nE-mail : jwfy22465@yahoo.com.cn");
  1099. }
  1100. });
  1101. helpMenu.add(aboutItem);
  1102. return menuBar;
  1103. }
  1104. private class MyFilter extends FileFilter {
  1105. public boolean accept(File f) {
  1106. return f.getName().toLowerCase().endsWith(".jpt")
  1107. || f.isDirectory();
  1108. }
  1109. public String getDescription() {
  1110. return "JPaint file type";
  1111. }
  1112. }//生成.jpt的扩展名文件
  1113. /*
  1114.  * 类名:帮助窗口
  1115.  * 描述:生成文本区域用于显示帮助文档
  1116.  */
  1117. private class HelpFrame extends JFrame {
  1118. public HelpFrame() {
  1119. setTitle("JPaint Help");
  1120. setSize(450, 500);
  1121. setResizable(false);
  1122. JTextArea text = new JTextArea(20, 42);
  1123. Font f = new Font("宋体", Font.PLAIN, 20);
  1124. text.setFont(f);
  1125. text.setForeground(Color.BLUE);
  1126. text.setLineWrap(true);
  1127. text.setWrapStyleWord(true);
  1128. text.setEditable(false);
  1129. text.append("             JavaPaint Helpnn");
  1130. text.append("    JavaPaint是一个简易JAVA画图程序, "
  1131. + "借助于JAVA2D graphics的强大功能,"
  1132. + "可以实现简单的画图操作。 "
  1133. + "直线、矩形、椭圆、圆形都可以借助JAVA 2D库中相应的类实现,"
  1134. + "通过构建相应的类,调用Graphics2D的draw方法绘制图形。"
  1135. + "画笔和橡皮是把鼠标拖拽轨迹分成很多条可以当做是点的小直线 "
  1136. + "相连而实现的,");
  1137. text.append("这个小程序还可以画字体,包含了字体库中20个常用字体,"
  1138. + "还可以对设置字体大小颜色等 。"
  1139. + "程序生成.jpt文件,可以进行保存或者打开,"
  1140. + "实现类似于windows画图的功能 。"
  1141. + "该软件还有许多不足,如改变线宽或者字体时,全部线或者字体都会改变。"
  1142. + "由于作者对程序内部事件进行顺序不熟练,只好用static的类似于参量的值来表示。n");
  1143. getContentPane().add(text);//帮助文档
  1144. }
  1145. }
  1146. }
  1147. /*
  1148.  * 类名:设置线宽窗口
  1149.  * 描述:对线宽进行设置,包括画笔线宽,橡皮擦线宽,其他图形线宽
  1150.  */
  1151. class StrokeFrame extends JFrame {
  1152. public float a = 2.0f;
  1153. public float b = 3.0f;
  1154. public float c = 10.0f;
  1155. public StrokeFrame() {
  1156. setTitle("Stroke Frame");
  1157. setSize(450, 160);
  1158. setResizable(false);
  1159. JPanel subPanel = new JPanel();
  1160. GridLayout GridLayout = new GridLayout(3, 2);
  1161. subPanel.setLayout(GridLayout);
  1162. JLabel oneLabel = new JLabel("CurrentStroke:");
  1163. JLabel twoLabel = new JLabel("PenStroke:");
  1164. JLabel threeLabel = new JLabel("EraserStroke:");
  1165. one = new JTextField();
  1166. two = new JTextField();
  1167. three = new JTextField();
  1168. subPanel.add(oneLabel);
  1169. subPanel.add(one);
  1170. subPanel.add(twoLabel);
  1171. subPanel.add(two);
  1172. subPanel.add(threeLabel);
  1173. subPanel.add(three);
  1174. add(subPanel, BorderLayout.CENTER);
  1175. JButton ok = new JButton("ok");
  1176. add(ok, BorderLayout.SOUTH);
  1177. NextAction nextAction = new NextAction();
  1178. ok.addActionListener(nextAction);
  1179. }
  1180. JTextField one;
  1181. JTextField two;
  1182. JTextField three;
  1183. public class NextAction implements ActionListener {
  1184. public void actionPerformed(ActionEvent event) {
  1185. a = Float.valueOf(one.getText());
  1186. b = Float.valueOf(two.getText());
  1187. c = Float.valueOf(three.getText());
  1188. PaintPanel.currentstroke = a;
  1189. PaintPanel.penstroke = b;
  1190. PaintPanel.eraserstroke = c;
  1191. }
  1192. }
  1193. }
  1194. /*
  1195.  * 类名:准确画图窗口
  1196.  * 描述:准确设置某图形的坐标形状等参数,传递给画笔进行画图
  1197.  */
  1198. class AcuteFrame extends JFrame {
  1199. public static int sx, sy;
  1200. public static int ex, ey;
  1201. public static int currentshape = 0;
  1202. public AcuteFrame() {
  1203. setTitle("Acute Fram");
  1204. setSize(450, 180);
  1205. setResizable(false);
  1206. JPanel subPanel = new JPanel();
  1207. GridLayout GridLayout = new GridLayout(2, 4);
  1208. subPanel.setLayout(GridLayout);
  1209. JLabel oneLabel = new JLabel("Start coordinate-x:");
  1210. JLabel twoLabel = new JLabel("Start coordinate-y:");
  1211. JLabel threeLabel = new JLabel("End coordinate-x:");
  1212. JLabel fourLabel = new JLabel("End coordinate-y:");
  1213. one = new JTextField();
  1214. two = new JTextField();
  1215. three = new JTextField();
  1216. four = new JTextField();
  1217. subPanel.add(oneLabel);
  1218. subPanel.add(one);
  1219. subPanel.add(twoLabel);
  1220. subPanel.add(two);
  1221. subPanel.add(threeLabel);
  1222. subPanel.add(three);
  1223. subPanel.add(fourLabel);
  1224. subPanel.add(four);
  1225. add(subPanel, BorderLayout.NORTH);
  1226. JPanel upPanel = new JPanel();
  1227. GridLayout GridLayout1 = new GridLayout(4, 1);
  1228. subPanel.setLayout(GridLayout1);
  1229. JButton lineButton1 = new JButton("Line");
  1230. JButton squareButton1 = new JButton("Square");
  1231. JButton ellipseButton1 = new JButton("Ellipse");
  1232. JButton roundButton1 = new JButton("Round");
  1233. lineButton1.setToolTipText("Draw a line");
  1234. squareButton1.setToolTipText("Draw a rectangle");
  1235. ellipseButton1.setToolTipText("Draw a ecllipse");
  1236. roundButton1.setToolTipText("Draw a round");
  1237. upPanel.add(lineButton1);
  1238. upPanel.add(squareButton1);
  1239. upPanel.add(ellipseButton1);
  1240. upPanel.add(roundButton1);
  1241. add(upPanel, BorderLayout.CENTER);
  1242. JButton ok = new JButton("OK");
  1243. add(ok, BorderLayout.SOUTH);
  1244. NextAction1 nextAction1 = new NextAction1();
  1245. NextAction2 nextAction2 = new NextAction2();
  1246. NextAction3 nextAction3 = new NextAction3();
  1247. NextAction4 nextAction4 = new NextAction4();
  1248. NextAction5 nextAction5 = new NextAction5();
  1249. ok.addActionListener(nextAction5);
  1250. lineButton1.addActionListener(nextAction1);
  1251. squareButton1.addActionListener(nextAction2);
  1252. ellipseButton1.addActionListener(nextAction3);
  1253. roundButton1.addActionListener(nextAction4);
  1254. }
  1255. JTextField one;
  1256. JTextField two;
  1257. JTextField three;
  1258. JTextField four;
  1259. public class NextAction5 implements ActionListener {
  1260. public void actionPerformed(ActionEvent event) {
  1261. sx = Integer.valueOf(one.getText());
  1262. sy = Integer.valueOf(two.getText());
  1263. ex = Integer.valueOf(three.getText());
  1264. ey = Integer.valueOf(four.getText());
  1265. }
  1266. }
  1267. public class NextAction4 implements ActionListener {
  1268. public void actionPerformed(ActionEvent event) {
  1269. currentshape = Shape.ACUTEROUND;
  1270. PaintPanel.acutesx = sx;
  1271. PaintPanel.acutesy = sy;
  1272. PaintPanel.acuteex = ex;
  1273. PaintPanel.acuteey = ey;
  1274. }
  1275. }
  1276. public class NextAction3 implements ActionListener {
  1277. public void actionPerformed(ActionEvent event) {
  1278. currentshape = Shape.ACUTEELLIPSE;
  1279. PaintPanel.acutesx = sx;
  1280. PaintPanel.acutesy = sy;
  1281. PaintPanel.acuteex = ex;
  1282. PaintPanel.acuteey = ey;
  1283. }
  1284. }
  1285. public class NextAction2 implements ActionListener {
  1286. public void actionPerformed(ActionEvent event) {
  1287. currentshape = Shape.ACUTESQUARE;
  1288. PaintPanel.acutesx = sx;
  1289. PaintPanel.acutesy = sy;
  1290. PaintPanel.acuteex = ex;
  1291. PaintPanel.acuteey = ey;
  1292. }
  1293. }
  1294. public class NextAction1 implements ActionListener {
  1295. public void actionPerformed(ActionEvent event) {
  1296. currentshape = Shape.ACUTELINE;
  1297. PaintPanel.acutesx = sx;
  1298. PaintPanel.acutesy = sy;
  1299. PaintPanel.acuteex = ex;
  1300. PaintPanel.acuteey = ey;
  1301. }
  1302. }
  1303. }
  1304. /*
  1305.  * 类名:字体设置窗口
  1306.  * 描述: 对字号和字体进行设置
  1307.  */
  1308. class FontSetting extends JFrame {
  1309. public static int number;// 字号
  1310. public static String s2;
  1311. public static int style;
  1312. public FontSetting() {
  1313. setTitle("Font setting");
  1314. setSize(400, 300);
  1315. setResizable(false);
  1316. JPanel subPanel = new JPanel();
  1317. GridLayout GridLayout = new GridLayout(2, 1);
  1318. subPanel.setLayout(GridLayout);
  1319. JLabel oneLabel = new JLabel("字体大小(磅值):");
  1320. one = new JTextField();
  1321. subPanel.add(oneLabel);
  1322. subPanel.add(one);
  1323. add(subPanel, BorderLayout.NORTH);
  1324. JPanel upPanel = new JPanel();
  1325. GridLayout GridLayout1 = new GridLayout(4, 5);
  1326. subPanel.setLayout(GridLayout1);
  1327. JButton brush1 = new JButton("Arial");
  1328. JButton brush2 = new JButton("Consolas Italic");
  1329. JButton brush3 = new JButton("Constantia");
  1330. JButton brush4 = new JButton("Corbel");
  1331. JButton brush5 = new JButton("Forte");
  1332. JButton brush6 = new JButton("Gisha");
  1333. JButton brush7 = new JButton("Courier");
  1334. JButton brush8 = new JButton("Times New Roman");
  1335. JButton brush9 = new JButton("Onyx");
  1336. JButton brush10 = new JButton("Perpetua");
  1337. JButton brush11 = new JButton("宋体");
  1338. JButton brush12 = new JButton("黑体");
  1339. JButton brush13 = new JButton("仿宋");
  1340. JButton brush14 = new JButton("隶书");
  1341. JButton brush15 = new JButton("楷体");
  1342. JButton brush16 = new JButton("Waker");
  1343. JButton brush17 = new JButton("Vrinda");
  1344. JButton brush18 = new JButton("Teen");
  1345. JButton brush19 = new JButton("Vivaldi");
  1346. JButton brush20 = new JButton("Jokerman");
  1347. upPanel.add(brush1);
  1348. upPanel.add(brush2);
  1349. upPanel.add(brush3);
  1350. upPanel.add(brush4);
  1351. upPanel.add(brush5);
  1352. upPanel.add(brush6);
  1353. upPanel.add(brush7);
  1354. upPanel.add(brush8);
  1355. upPanel.add(brush9);
  1356. upPanel.add(brush10);
  1357. upPanel.add(brush11);
  1358. upPanel.add(brush12);
  1359. upPanel.add(brush13);
  1360. upPanel.add(brush14);
  1361. upPanel.add(brush15);
  1362. upPanel.add(brush16);
  1363. upPanel.add(brush17);
  1364. upPanel.add(brush18);
  1365. upPanel.add(brush19);
  1366. upPanel.add(brush20);
  1367. add(upPanel, BorderLayout.CENTER);
  1368. NextAction1 nextAction1 = new NextAction1();
  1369. NextAction2 nextAction2 = new NextAction2();
  1370. NextAction3 nextAction3 = new NextAction3();
  1371. NextAction4 nextAction4 = new NextAction4();
  1372. NextAction5 nextAction5 = new NextAction5();
  1373. NextAction6 nextAction6 = new NextAction6();
  1374. NextAction7 nextAction7 = new NextAction7();
  1375. NextAction8 nextAction8 = new NextAction8();
  1376. NextAction9 nextAction9 = new NextAction9();
  1377. NextAction10 nextAction10 = new NextAction10();
  1378. NextAction11 nextAction11 = new NextAction11();
  1379. NextAction12 nextAction12 = new NextAction12();
  1380. NextAction13 nextAction13 = new NextAction13();
  1381. NextAction14 nextAction14 = new NextAction14();
  1382. NextAction15 nextAction15 = new NextAction15();
  1383. NextAction16 nextAction16 = new NextAction16();
  1384. NextAction17 nextAction17 = new NextAction17();
  1385. NextAction18 nextAction18 = new NextAction18();
  1386. NextAction19 nextAction19 = new NextAction19();
  1387. NextAction20 nextAction20 = new NextAction20();
  1388. brush1.addActionListener(nextAction1);
  1389. brush2.addActionListener(nextAction2);
  1390. brush3.addActionListener(nextAction3);
  1391. brush4.addActionListener(nextAction4);
  1392. brush5.addActionListener(nextAction5);
  1393. brush6.addActionListener(nextAction6);
  1394. brush7.addActionListener(nextAction7);
  1395. brush8.addActionListener(nextAction8);
  1396. brush9.addActionListener(nextAction9);
  1397. brush10.addActionListener(nextAction10);
  1398. brush11.addActionListener(nextAction11);
  1399. brush12.addActionListener(nextAction12);
  1400. brush13.addActionListener(nextAction13);
  1401. brush14.addActionListener(nextAction14);
  1402. brush15.addActionListener(nextAction15);
  1403. brush16.addActionListener(nextAction16);
  1404. brush17.addActionListener(nextAction17);
  1405. brush18.addActionListener(nextAction18);
  1406. brush19.addActionListener(nextAction19);
  1407. brush20.addActionListener(nextAction20);
  1408. }
  1409. JTextField one;
  1410. public class NextAction1 implements ActionListener {
  1411. public void actionPerformed(ActionEvent event) {
  1412. PaintPanel.style1 = "Arial";
  1413. number = Integer.valueOf(one.getText());
  1414. PaintPanel.num = number;
  1415. }
  1416. }
  1417. public class NextAction2 implements ActionListener {
  1418. public void actionPerformed(ActionEvent event) {
  1419. PaintPanel.style1 = "Consolas Italic";
  1420. number = Integer.valueOf(one.getText());
  1421. PaintPanel.num = number;
  1422. }
  1423. }
  1424. public class NextAction3 implements ActionListener {
  1425. public void actionPerformed(ActionEvent event) {
  1426. PaintPanel.style1 = "Constantia";
  1427. number = Integer.valueOf(one.getText());
  1428. PaintPanel.num = number;
  1429. }
  1430. }
  1431. public class NextAction4 implements ActionListener {
  1432. public void actionPerformed(ActionEvent event) {
  1433. PaintPanel.style1 = "Corbel";
  1434. number = Integer.valueOf(one.getText());
  1435. PaintPanel.num = number;
  1436. }
  1437. }
  1438. public class NextAction5 implements ActionListener {
  1439. public void actionPerformed(ActionEvent event) {
  1440. PaintPanel.style1 = "Forte";
  1441. number = Integer.valueOf(one.getText());
  1442. PaintPanel.num = number;
  1443. }
  1444. }
  1445. public class NextAction6 implements ActionListener {
  1446. public void actionPerformed(ActionEvent event) {
  1447. PaintPanel.style1 = "Gisha";
  1448. number = Integer.valueOf(one.getText());
  1449. PaintPanel.num = number;
  1450. }
  1451. }
  1452. public class NextAction7 implements ActionListener {
  1453. public void actionPerformed(ActionEvent event) {
  1454. PaintPanel.style1 = "Courier";
  1455. number = Integer.valueOf(one.getText());
  1456. PaintPanel.num = number;
  1457. }
  1458. }
  1459. public class NextAction8 implements ActionListener {
  1460. public void actionPerformed(ActionEvent event) {
  1461. PaintPanel.style1 = "Times New Roman";
  1462. number = Integer.valueOf(one.getText());
  1463. PaintPanel.num = number;
  1464. }
  1465. }
  1466. public class NextAction9 implements ActionListener {
  1467. public void actionPerformed(ActionEvent event) {
  1468. PaintPanel.style1 = "Onyx";
  1469. number = Integer.valueOf(one.getText());
  1470. PaintPanel.num = number;
  1471. }
  1472. }
  1473. public class NextAction10 implements ActionListener {
  1474. public void actionPerformed(ActionEvent event) {
  1475. PaintPanel.style1 = "Perpetua";
  1476. number = Integer.valueOf(one.getText());
  1477. PaintPanel.num = number;
  1478. }
  1479. }
  1480. public class NextAction11 implements ActionListener {
  1481. public void actionPerformed(ActionEvent event) {
  1482. PaintPanel.style1 = "宋体";
  1483. number = Integer.valueOf(one.getText());
  1484. PaintPanel.num = number;
  1485. }
  1486. }
  1487. public class NextAction12 implements ActionListener {
  1488. public void actionPerformed(ActionEvent event) {
  1489. PaintPanel.style1 = "黑体";
  1490. number = Integer.valueOf(one.getText());
  1491. PaintPanel.num = number;
  1492. }
  1493. }
  1494. public class NextAction13 implements ActionListener {
  1495. public void actionPerformed(ActionEvent event) {
  1496. PaintPanel.style1 = "仿宋";
  1497. number = Integer.valueOf(one.getText());
  1498. PaintPanel.num = number;
  1499. }
  1500. }
  1501. public class NextAction14 implements ActionListener {
  1502. public void actionPerformed(ActionEvent event) {
  1503. PaintPanel.style1 = "隶书";
  1504. number = Integer.valueOf(one.getText());
  1505. PaintPanel.num = number;
  1506. }
  1507. }
  1508. public class NextAction15 implements ActionListener {
  1509. public void actionPerformed(ActionEvent event) {
  1510. PaintPanel.style1 = "楷体";
  1511. number = Integer.valueOf(one.getText());
  1512. PaintPanel.num = number;
  1513. }
  1514. }
  1515. public class NextAction16 implements ActionListener {
  1516. public void actionPerformed(ActionEvent event) {
  1517. PaintPanel.style1 = "Waker";
  1518. number = Integer.valueOf(one.getText());
  1519. PaintPanel.num = number;
  1520. }
  1521. }
  1522. public class NextAction17 implements ActionListener {
  1523. public void actionPerformed(ActionEvent event) {
  1524. PaintPanel.style1 = "Vrinda";
  1525. number = Integer.valueOf(one.getText());
  1526. PaintPanel.num = number;
  1527. }
  1528. }
  1529. public class NextAction18 implements ActionListener {
  1530. public void actionPerformed(ActionEvent event) {
  1531. PaintPanel.style1 = "Teen";
  1532. number = Integer.valueOf(one.getText());
  1533. PaintPanel.num = number;
  1534. }
  1535. }
  1536. public class NextAction19 implements ActionListener {
  1537. public void actionPerformed(ActionEvent event) {
  1538. PaintPanel.style1 = "Vivaldi";
  1539. number = Integer.valueOf(one.getText());
  1540. PaintPanel.num = number;
  1541. }
  1542. }
  1543. public class NextAction20 implements ActionListener {
  1544. public void actionPerformed(ActionEvent event) {
  1545. PaintPanel.style1 = "Jokerman";
  1546. number = Integer.valueOf(one.getText());
  1547. PaintPanel.num = number;
  1548. }
  1549. }
  1550. }
  1551. /*
  1552.  * 类名:主程序
  1553.  * 描述:画图程序运行的主程序
  1554.  */
  1555. public class JPaint {
  1556. public static void main(String[] args) {
  1557. PaintFrame frame = new PaintFrame();
  1558. JFrame.setDefaultLookAndFeelDecorated(true);
  1559. JDialog.setDefaultLookAndFeelDecorated(true);
  1560. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  1561. frame.show();
  1562. }
  1563. }