Editor.java
上传用户:sdzznc
上传日期:2022-07-23
资源大小:51k
文件大小:10k
源码类别:

绘图程序

开发平台:

Java

  1. // Copyright by Scot Drysdale
  2. package cn.edu.nju.software.grapheditor;
  3. import java.awt.BorderLayout;
  4. import java.awt.Color;
  5. import java.awt.Container;
  6. import java.awt.Dimension;
  7. import java.awt.FlowLayout;
  8. import java.awt.Graphics;
  9. import java.awt.GridLayout;
  10. import java.awt.event.ActionEvent;
  11. import java.awt.event.ActionListener;
  12. import java.awt.event.MouseEvent;
  13. import java.awt.event.MouseListener;
  14. import java.awt.event.MouseMotionListener;
  15. import javax.swing.BorderFactory;
  16. import javax.swing.JApplet;
  17. import javax.swing.JButton;
  18. import javax.swing.JLabel;
  19. import javax.swing.JPanel;
  20. import cn.edu.nju.software.grapheditor.cmd.*;
  21. public class Editor extends JApplet {
  22. private static final long serialVersionUID = 1L;
  23. private final int APPLET_WIDTH = 700, APPLET_HEIGHT = 500;
  24. private final Color initialColor = Color.red; // default color starts as red
  25. private Command cmd; // the command being executed
  26. private Drawing dwg; // the drawing: shapes in order
  27. private ColorIndicator colorBox; // a GUI component to show the current
  28. // default color
  29. public void init() {
  30. cmd = new Command(); // all methods in Command are empty
  31. dwg = new Drawing(initialColor); // make an empty drawing
  32. // The drawing will appear in a white CanvasPanel.
  33. CanvasPanel canvasPanel = new CanvasPanel();
  34. canvasPanel.setBackground(Color.white);
  35. // Make JButton objects for all the command buttons.
  36. JButton rectButton = new JButton("Rectangle");
  37. JButton ovalButton = new JButton("Oval");
  38. JButton lineButton = new JButton("Line");
  39. JButton moveButton = new JButton("Move");
  40. JButton deleteButton = new JButton("Delete");
  41. JButton frontButton = new JButton("Front");
  42. JButton backButton = new JButton("Back");
  43. JButton exchangeButton = new JButton("Exchange");
  44. JButton redButton = new JButton("Red");
  45. JButton greenButton = new JButton("Green");
  46. JButton blueButton = new JButton("Blue");
  47. // Add listeners for all the command buttons.
  48. rectButton.addActionListener(new RectButtonListener());
  49. ovalButton.addActionListener(new OvalButtonListener());
  50. lineButton.addActionListener(new LineButtonListener());
  51. moveButton.addActionListener(new MoveButtonListener());
  52. deleteButton.addActionListener(new DeleteButtonListener());
  53. frontButton.addActionListener(new FrontButtonListener());
  54. backButton.addActionListener(new BackButtonListener());
  55. exchangeButton.addActionListener(new ExchangeButtonListener());
  56. redButton.addActionListener(new RedButtonListener());
  57. greenButton.addActionListener(new GreenButtonListener());
  58. blueButton.addActionListener(new BlueButtonListener());
  59. // The command buttons will be arranged in 3 rows.
  60. // Each row will appear in its own JPanel, and the 3 JPanels will
  61. // be stacked vertically.
  62. JPanel shapePanel = new JPanel(); // holds buttons for adding shapes
  63. JLabel shapeLabel = new JLabel("Add shape:");
  64. shapePanel.setLayout(new FlowLayout());
  65. shapePanel.add(shapeLabel);
  66. rectButton.setBackground(Color.yellow);
  67. ovalButton.setBackground(Color.yellow);
  68. lineButton.setBackground(Color.yellow);
  69. shapePanel.add(rectButton);
  70. shapePanel.add(ovalButton);
  71. shapePanel.add(lineButton);
  72. JPanel editPanel = new JPanel(); // holds buttons for editing operations
  73. JLabel editLabel = new JLabel("Edit:");
  74. editPanel.setLayout(new FlowLayout());
  75. editPanel.add(editLabel);
  76. moveButton.setBackground(Color.yellow);
  77. deleteButton.setBackground(Color.yellow);
  78. frontButton.setBackground(Color.yellow);
  79. backButton.setBackground(Color.yellow);
  80. exchangeButton.setBackground(Color.yellow);
  81. editPanel.add(moveButton);
  82. editPanel.add(deleteButton);
  83. editPanel.add(frontButton);
  84. editPanel.add(backButton);
  85. editPanel.add(exchangeButton);
  86. // The color panel is slightly different from the other two. In addition
  87. // to a label and buttons for the color commands, this panel holds a
  88. // ColorIndicator that gives the current default color.
  89. JPanel colorPanel = new JPanel();
  90. JLabel colorLabel = new JLabel("Colors:");
  91. colorPanel.setLayout(new FlowLayout());
  92. colorPanel.add(colorLabel);
  93. colorBox = new ColorIndicator();
  94. colorBox.show(initialColor);
  95. redButton.setBackground(Color.yellow);
  96. greenButton.setBackground(Color.yellow);
  97. blueButton.setBackground(Color.yellow);
  98. colorPanel.add(colorBox);
  99. colorPanel.add(redButton);
  100. colorPanel.add(greenButton);
  101. colorPanel.add(blueButton);
  102. // Use a grid layout to stack the button panels vertically.
  103. // Also, give them a cyan background.
  104. JPanel buttonPanel = new JPanel();
  105. buttonPanel.setLayout(new GridLayout(3, 1));
  106. shapePanel.setBackground(Color.cyan);
  107. editPanel.setBackground(Color.cyan);
  108. colorPanel.setBackground(Color.cyan);
  109. buttonPanel.add(shapePanel);
  110. buttonPanel.add(editPanel);
  111. buttonPanel.add(colorPanel);
  112. // Now we have two panels: buttonPanel and canvasPanel. We want
  113. // buttonPanel to appear above canvasPanel, and canvasPanel should grow
  114. // with the applet.
  115. Container cp = getContentPane();
  116. cp.setLayout(new BorderLayout());
  117. cp.add(buttonPanel, BorderLayout.NORTH);
  118. cp.add(canvasPanel, BorderLayout.CENTER);
  119. setSize(APPLET_WIDTH, APPLET_HEIGHT);
  120. }
  121. public void paint(Graphics page) {
  122. super.paint(page); // make all the GUI components paint themselves
  123. }
  124. // What to do when rectButton is pressed.
  125. private class RectButtonListener implements ActionListener {
  126. public void actionPerformed(ActionEvent event) {
  127. cmd=new RectCmd();
  128. // YOU FILL THIS IN.
  129. repaint();
  130. }
  131. }
  132. // What to do when ovalButton is pressed.
  133. private class OvalButtonListener implements ActionListener {
  134. public void actionPerformed(ActionEvent event) {
  135. cmd=new OvalCmd();
  136. // YOU FILL THIS IN.
  137. repaint();
  138. }
  139. }
  140. // What to do when lineButton is pressed.
  141. private class LineButtonListener implements ActionListener {
  142. public void actionPerformed(ActionEvent event) {
  143. cmd=new LineCmd();
  144. // YOU FILL THIS IN.
  145. repaint();
  146. }
  147. }
  148. // What to do when moveButton is pressed.
  149. private class MoveButtonListener implements ActionListener {
  150. public void actionPerformed(ActionEvent event) {
  151. cmd =new MoveCmd();
  152. // YOU FILL THIS IN.
  153. repaint();
  154. }
  155. }
  156. // What to do when deleteButton is pressed.
  157. private class DeleteButtonListener implements ActionListener {
  158. public void actionPerformed(ActionEvent event) {
  159. cmd =new DeleteCmd();
  160. // YOU FILL THIS IN.
  161. repaint();
  162. }
  163. }
  164. // What to do when frontButton is pressed.
  165. private class FrontButtonListener implements ActionListener {
  166. public void actionPerformed(ActionEvent event) {
  167. cmd =new FrontCmd();
  168. // YOU FILL THIS IN.
  169. repaint();
  170. }
  171. }
  172. // What to do when backButton is pressed.
  173. private class BackButtonListener implements ActionListener {
  174. public void actionPerformed(ActionEvent event) {
  175. cmd=new BackCmd();
  176. // YOU FILL THIS IN.
  177. repaint();
  178. }
  179. }
  180. // What to do when exchangeButton is pressed.
  181. private class ExchangeButtonListener implements ActionListener {
  182. public void actionPerformed(ActionEvent event) {
  183. cmd =new ExchangeCmd();
  184. // YOU FILL THIS IN.
  185. repaint();
  186. }
  187. }
  188. // What to do when redButton is pressed.
  189. private class RedButtonListener implements ActionListener {
  190. public void actionPerformed(ActionEvent event) {
  191. cmd = new ColorCmd();
  192. colorBox.show(Color.red); // show that the new default color is red
  193. dwg.currentColor=Color.red;
  194. // YOU FILL THIS IN.
  195. repaint();
  196. }
  197. }
  198. // What to do when greenButton is pressed.
  199. private class GreenButtonListener implements ActionListener {
  200. public void actionPerformed(ActionEvent event) {
  201. cmd = new ColorCmd();
  202. colorBox.show(Color.green); // show that the new default color is
  203. // green
  204. dwg.currentColor=Color.green;
  205. // YOU FILL THIS IN.
  206. repaint();
  207. }
  208. }
  209. // What to do when blueButton is pressed.
  210. private class BlueButtonListener implements ActionListener {
  211. public void actionPerformed(ActionEvent event) {
  212. cmd = new ColorCmd();
  213. colorBox.show(Color.blue); // show that the new default color is
  214. // blue
  215. dwg.currentColor=Color.blue;
  216. // YOU FILL THIS IN.
  217. repaint();
  218. }
  219. }
  220. // A ColorIndicator shows what the current color is.
  221. private class ColorIndicator extends JPanel {
  222. private static final long serialVersionUID = 0;
  223. private final int COLORBOX_WIDTH = 20, COLORBOX_HEIGHT = 20;
  224. // Constructor sets the size and border.
  225. public ColorIndicator() {
  226. setBorder(BorderFactory.createEtchedBorder());
  227. setPreferredSize(new Dimension(COLORBOX_WIDTH, COLORBOX_HEIGHT));
  228. }
  229. // Show a new color.
  230. public void show(Color color) {
  231. setBackground(color);
  232. }
  233. }
  234. // CanvasPanel is the class upon which we actually draw.
  235. // It listens for mouse events and calls the appropriate method of the
  236. // current command.
  237. private class CanvasPanel extends JPanel implements MouseListener,
  238. MouseMotionListener {
  239. private static final long serialVersionUID = 0;
  240. // Constructor just needs to set up the CanvasPanel as a listener.
  241. public CanvasPanel() {
  242. addMouseListener(this);
  243. addMouseMotionListener(this);
  244. }
  245. public void paint(Graphics page) {
  246. super.paint(page); // execute the paint method of JPanel
  247. dwg.draw(page); // have the drawing draw itself
  248. }
  249. // When the mouse is clicked, call the executeClick method of the
  250. // current command.
  251. public void mouseClicked(MouseEvent event) {
  252. cmd.executeClick(event.getPoint(), dwg);
  253. repaint();
  254. }
  255. // When the mouse is pressed, call the executePress method of the
  256. // current command.
  257. public void mousePressed(MouseEvent event) {
  258. cmd.executePress(event.getPoint(), dwg);
  259. repaint();
  260. }
  261. // When the mouse is dragged, call the executeDrag method of the current
  262. // command.
  263. public void mouseDragged(MouseEvent event) {
  264. cmd.executeDrag(event.getPoint(), dwg);
  265. repaint();
  266. }
  267. // We don't care about the other mouse events.
  268. public void mouseReleased(MouseEvent event) {
  269. }
  270. public void mouseEntered(MouseEvent event) {
  271. }
  272. public void mouseExited(MouseEvent event) {
  273. }
  274. public void mouseMoved(MouseEvent event) {
  275. }
  276. }
  277. }