1. 程式人生 > >一個用JAVA寫的畫圖程式

一個用JAVA寫的畫圖程式

 功能類似WINDOWS的畫圖程式,程式碼比較規範。對於剛剛接觸圖形介面開發的人很有幫助。(對我幫助也很大)

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import java.io.*;
  5. //定義畫圖的基本圖形單元
  6. publicclass MiniDrawPad extends JFrame //主類,擴充套件了JFrame類,用來生成主介面
  7. {
  8. private ObjectInputStream input;
  9. private ObjectOutputStream output; //定義輸入輸出流,用來呼叫和儲存影象檔案
  10. private JButton choices[];         //按鈕陣列,存放以下名稱的功能按鈕
  11. private String names[] = {
  12. "New",
  13. "Open",
  14. "Save"//這三個是基本操作按鈕,包括"新建"、"開啟"、"儲存"
  15. /*接下來是我們的畫圖板上面有的基本的幾個繪圖單元按鈕*/
  16. "Pencil"//鉛筆畫,也就是用滑鼠拖動著隨意繪圖
  17. "Line"//繪製直線
  18. "Rect"//繪製空心矩形
  19. "fRect"//繪製以指定顏色填充的實心矩形
  20. "Oval"//繪製空心橢圓
  21. "fOval"//繪製以指定顏色填充的實心橢圓
  22. "Circle"//繪製圓形
  23. "fCircle"//繪製以指定顏色填充的實心圓形
  24. "RoundRect"//繪製空心圓角矩形
  25. "frRect"//繪製以指定顏色填充的實心圓角矩形
  26. "Rubber"//橡皮擦,可用來擦去已經繪製好的圖案
  27. "Color"//選擇顏色按鈕,可用來選擇需要的顏色
  28. "Stroke"//選擇線條粗細的按鈕,輸入需要的數值可以實現繪圖線條粗細的變化
  29. "Word"//輸入文字按鈕,可以在繪圖板上實現文字輸入
  30.     };
  31. private String styleNames[] = {
  32. " 宋體 "" 隸書 "" 華文彩雲 "" 仿宋_GB2312 "" 華文行楷 ",
  33. " 方正舒體 "" Times New Roman "" Serif "" Monospaced ",
  34. " SonsSerif "" Garamond "
  35.     };            //可供選擇的字型項
  36. //當然這裡的靈活的結構可以讓讀者自己隨意新增系統支援的字型
  37. private Icon items[];
  38. private String tipText[] = {
  39. //這裡是滑鼠移動到相應按鈕上面上停留時給出的提示說明條
  40. //讀者可以參照上面的按鈕定義對照著理解
  41. "Draw a new picture",
  42. "Open a saved picture",
  43. "Save current drawing",
  44. "Draw at will",
  45. "Draw a straight line",
  46. "Draw a rectangle",
  47. "Fill a ractangle",
  48. "Draw an oval",
  49. "Fill an oval",
  50. "Draw a circle",
  51. "Fill a circle",
  52. "Draw a round rectangle",
  53. "Fill a round rectangle",
  54. "Erase at will",
  55. "Choose current drawing color",
  56. "Set current drawing stroke",
  57. "Write down what u want"
  58.     };
  59.     JToolBar buttonPanel;              //定義按鈕面板
  60. private JLabel statusBar;            //顯示滑鼠狀態的提示條
  61. private DrawPanel drawingArea;       //畫圖區域
  62. privateint width = 800,  height = 550;    //定義畫圖區域初始大小
  63.     drawings[] itemList = new drawings[5000]; //用來存放基本圖形的陣列
  64. privateint currentChoice = 3;            //設定預設畫圖狀態為隨筆畫
  65. int index = 0;                         //當前已經繪製的圖形數目
  66. private Color color = Color.black;     //當前畫筆顏色
  67. int R, G, B;                           //用來存放當前色彩值
  68. int f1, f2;                  //用來存放當前字型風格
  69.     String style1;              //用來存放當前字型
  70. privatefloat stroke = 1.0f;  //設定畫筆粗細,預設值為1.0f
  71.     JCheckBox bold, italic;      //定義字型風格選擇框
  72. //bold為粗體,italic為斜體,二者可以同時使用
  73.     JComboBox styles;
  74. public MiniDrawPad() //建構函式
  75.     {
  76. super("Drawing Pad");
  77.         JMenuBar bar = new JMenuBar();      //定義選單條
  78.         JMenu fileMenu = new JMenu("File");
  79.         fileMenu.setMnemonic('F');
  80. //新建檔案選單條
  81.         JMenuItem newItem = new JMenuItem("New");
  82.         newItem.setMnemonic('N');
  83.         newItem.addActionListener(
  84. new ActionListener() {
  85. publicvoid actionPerformed(ActionEvent e) {
  86.                         newFile();      //如果被觸發,則呼叫新建檔案函式段
  87.                     }
  88.                 });
  89.         fileMenu.add(newItem);
  90. //儲存檔案選單項
  91.         JMenuItem saveItem = new JMenuItem("Save");
  92.         saveItem.setMnemonic('S');
  93.         saveItem.addActionListener(
  94. new ActionListener() {
  95. publicvoid actionPerformed(ActionEvent e) {
  96.                         saveFile();     //如果被觸發,則呼叫儲存檔案函式段
  97.                     }
  98.                 });
  99.         fileMenu.add(saveItem);
  100. //開啟檔案選單項
  101.         JMenuItem loadItem = new JMenuItem("Load");
  102.         loadItem.setMnemonic('L');
  103.         loadItem.addActionListener(
  104. new ActionListener() {
  105. publicvoid actionPerformed(ActionEvent e) {
  106.                         loadFile();     //如果被觸發,則呼叫開啟檔案函式段
  107.                     }
  108.                 });
  109.         fileMenu.add(loadItem);
  110.         fileMenu.addSeparator();
  111. //退出選單項
  112.         JMenuItem exitItem = new JMenuItem("Exit");
  113.         exitItem.setMnemonic('X');
  114.         exitItem.addActionListener(
  115. new ActionListener() {
  116. publicvoid actionPerformed(ActionEvent e) {
  117.                         System.exit(0); //如果被觸發,則退出畫圖板程式
  118.                     }
  119.                 });
  120.         fileMenu.add(exitItem);
  121.         bar.add(fileMenu);
  122. //設定顏色選單條
  123.         JMenu colorMenu = new JMenu("Color");
  124.         colorMenu.setMnemonic('C');
  125. //選擇顏色選單項
  126.         JMenuItem colorItem = new JMenuItem("Choose Color");
  127.         colorItem.setMnemonic('O');
  128.         colorItem.addActionListener(
  129. new ActionListener() {
  130. publicvoid actionPerformed(ActionEvent e) {
  131.                         chooseColor();  //如果被觸發,則呼叫選擇顏色函式段
  132.                     }
  133.                 });
  134.         colorMenu.add(colorItem);
  135.         bar.add(colorMenu);
  136. //設定線條粗細選單條
  137.         JMenu strokeMenu = new JMenu("Stroke");
  138.         strokeMenu.setMnemonic('S');
  139. //設定線條粗細選單項
  140.         JMenuItem strokeItem = new JMenuItem("Set Stroke");
  141.         strokeItem.setMnemonic('K');
  142.         strokeItem.addActionListener(
  143. new ActionListener() {
  144. publicvoid actionPerformed(ActionEvent e) {
  145.                         setStroke();
  146.                     }
  147.                 });
  148.         strokeMenu.add(strokeItem);
  149.         bar.add(strokeMenu);
  150. //設定提示選單條
  151.         JMenu helpMenu = new JMenu("Help");
  152.         helpMenu.setMnemonic('H');
  153. //設定提示選單項
  154.         JMenuItem aboutItem = new JMenuItem("About this Drawing Pad!");
  155.         aboutItem.setMnemonic('A');
  156.         aboutItem.addActionListener(
  157. new ActionListener() {
  158. publicvoid actionPerformed(ActionEvent e) {
  159.                         JOptionPane.showMessageDialog(null,
  160. "This is a mini drawing pad!/nCopyright (c) 2002 Tsinghua University ",
  161. " 畫圖板程式說明 ",
  162.                                 JOptionPane.INFORMATION_MESSAGE);
  163.                     }
  164.                 });
  165.         helpMenu.add(aboutItem);
  166.         bar.add(helpMenu);
  167.         items = new ImageIcon[names.length];
  168. //建立各種基本圖形的按鈕
  169.         drawingArea = new DrawPanel();
  170.         choices = new JButton[names.length];
  171.         buttonPanel = new JToolBar(JToolBar.VERTICAL);
  172.         buttonPanel = new JToolBar(JToolBar.HORIZONTAL);
  173.         ButtonHandler handler = new ButtonHandler();
  174.         ButtonHandler1 handler1 = new ButtonHandler1();
  175. //匯入我們需要的圖形圖示,這些圖示都存放在與原始檔相同的目錄下面
  176. for (int i = 0; i < choices.length; i++) {//items[i]=new ImageIcon( MiniDrawPad.class.getResource(names[i] +".gif"));
  177. //如果在jbuilder下執行本程式,則應該用這條語句匯入圖片
  178.             items[i] = new ImageIcon(names[i] + ".gif");
  179. //預設的在jdk或者jcreator下執行,用此語句匯入圖片
  180.             choices[i] = new JButton("", items[i]);
  181.             choices[i].setToolTipText(tipText[i]);
  182.             buttonPanel.add(choices[i]);
  183.         }
  184. //將動作偵聽器加入按鈕裡面
  185. for (int i = 3; i < choices.length - 3; i++) {
  186.             choices[i].addActionListener(handler);
  187.         }
  188.         choices[0].addActionListener(
  189. new ActionListener() {
  190. publicvoid actionPerformed(ActionEvent e) {
  191.                         newFile();
  192.                     }
  193.                 });
  194.         choices[1].addActionListener(
  195. new ActionListener() {
  196. publicvoid actionPerformed(ActionEvent e) {
  197.                         loadFile();
  198.                     }
  199.                 });
  200.         choices[2].addActionListener(
  201. new ActionListener() {
  202. publicvoid actionPerformed(ActionEvent e) {
  203.                         saveFile();
  204.                     }
  205.                 });
  206.         choices[choices.length - 3].addActionListener(handler1);
  207.         choices[choices.length - 2].addActionListener(handler1);
  208.         choices[choices.length - 1].addActionListener(handler1);
  209. //字型風格選擇
  210.         styles = new JComboBox(styleNames);
  211.         styles.setMaximumRowCount(8);
  212.         styles.addItemListener(
  213. new ItemListener() {
  214. publicvoid itemStateChanged(ItemEvent e) {
  215.                         style1 = styleNames[styles.getSelectedIndex()];
  216.                     }
  217.                 });
  218. //字型選擇
  219.         bold = new JCheckBox("BOLD");
  220.         italic = new JCheckBox("ITALIC");
  221.         checkBoxHandler cHandler = new checkBoxHandler();
  222.         bold.addItemListener(cHandler);
  223.         italic.addItemListener(cHandler);
  224.         JPanel wordPanel = new JPanel();
  225.         buttonPanel.add(bold);
  226.         buttonPanel.add(italic);
  227.         buttonPanel.add(styles);
  228.         styles.setMinimumSize(new Dimension(5020));
  229.         styles.setMaximumSize(new Dimension(10020));
  230.         Container c = getContentPane();
  231. super.setJMenuBar(bar);
  232.         c.add(buttonPanel, BorderLayout.NORTH);
  233.         c.add(drawingArea, BorderLayout.CENTER);
  234.         statusBar = new JLabel();
  235.         c.add(statusBar, BorderLayout.SOUTH);
  236.         statusBar.setText("     Welcome To The Little Drawing Pad!!!  :)");
  237.         createNewItem();
  238.         setSize(width, height);
  239.         show();
  240.     }
  241. //按鈕偵聽器ButtonHanler類,內部類,用來偵聽基本按鈕的操作
  242. publicclass ButtonHandler implements ActionListener {
  243. publicvoid actionPerformed(ActionEvent e) {
  244. for (int j = 3; j < choices.length - 3; j++) {
  245. if (e.getSource() == choices[j]) {
  246.                     currentChoice = j;
  247.                     createNewItem();
  248.                     repaint();
  249.                 }
  250.             }
  251.         }
  252.     }
  253. //按鈕偵聽器ButtonHanler1類,用來偵聽顏色選擇、畫筆粗細設定、文字輸入按鈕的操作
  254. publicclass ButtonHandler1 implements ActionListener {
  255. publicvoid actionPerformed(ActionEvent e) {
  256. if (e.getSource() == choices[choices.length - 3]) {
  257.                 chooseColor();
  258.             }
  259. if (e.getSource() == choices[choices.length - 2]) {
  260.                 setStroke();
  261.             }
  262. if (e.getSource() == choices[choices.length - 1]) {
  263.                 JOptionPane.showMessageDialog(null,
  264. "Please hit the drawing pad to choose the word input position",
  265. "Hint", JOptionPane.INFORMATION_MESSAGE);
  266.                 currentChoice = 14;
  267.                 createNewItem();
  268.                 repaint();
  269.             }
  270.         }
  271.     }
  272. //滑鼠事件mouseA類,繼承了MouseAdapter,用來完成滑鼠相應事件操作
  273. class mouseA extends MouseAdapter {
  274. publicvoid mousePressed(MouseEvent e) {
  275.             statusBar.setText("     Mouse Pressed @:[" + e.getX() +
  276. ", " + e.getY() + "]");//設定狀態提示
  277.             itemList[index].x1 = itemList[index].x2 = e.getX();
  278.             itemList[index].y1 = itemList[index].y2 = e.getY();
  279. //如果當前選擇的圖形是隨筆畫或者橡皮擦,則進行下面的操作
  280. if (currentChoice == 3 || currentChoice == 13) {
  281.                 itemList[index].x1 = itemList[index].x2 = e.getX();
  282.                 itemList[index].y1 = itemList[index].y2 = e.getY();
  283.                 index++;
  284.                 createNewItem();
  285.             }
  286. //如果當前選擇的圖形式文字輸入,則進行下面操作
  287. if (currentChoice == 14) {
  288.                 itemList[index].x1 = e.getX();
  289.                 itemList[index].y1 = e.getY();
  290.                 String input;
  291.                 input = JOptionPane.showInputDialog(
  292. "Please input the text you want!");
  293.                 itemList[index].s1 = input;
  294.                 itemList[index].x2 = f1;
  295.                 itemList[index].y2 = f2;
  296.                 itemList[index].s2 = style1;
  297.                 index++;
  298.                 currentChoice = 14;
  299.                 createNewItem();
  300.                 drawingArea.repaint();
  301.             }
  302.         }
  303. publicvoid mouseReleased(MouseEvent e) {
  304.             statusBar.setText("     Mouse Released @:[" + e.getX() +
  305. ", " + e.getY() + "]");
  306. if (currentChoice == 3 || currentChoice == 13) {
  307.                 itemList[index].x1 = e.getX();
  308.                 itemList[index].y1 = e.getY();
  309.             }
  310.             itemList[index].x2 = e.getX();
  311.             itemList[index].y2 = e.getY();
  312.             repaint();
  313.             index++;
  314.             createNewItem();
  315.         }
  316. publicvoid mouseEntered(MouseEvent e) {
  317.             statusBar.setText("     Mouse Entered @:[" + e.getX() +
  318. ", " + e.getY() + "]");
  319.         }
  320. publicvoid mouseExited(MouseEvent e) {
  321.             statusBar.setText("     Mouse Exited @:[" + e.getX() +
  322. ", " + e.getY() + "]");
  323.         }
  324.     }
  325. //滑鼠事件mouseB類繼承了MouseMotionAdapter,用來完成滑鼠拖動和滑鼠移動時的相應操作
  326. class mouseB extends MouseMotionAdapter {
  327. publicvoid mouseDragged(MouseEvent e) {
  328.             statusBar.setText("     Mouse Dragged @:[" + e.getX() +
  329. ", " + e.getY() + "]");
  330. if (currentChoice == 3 || currentChoice == 13) {
  331.                 itemList[index - 1].x1 = itemList[index].x2 = itemList[index].x1 = e.getX();
  332.                 itemList[index - 1].y1 = itemList[index].y2 = itemList[index].y1 = e.getY();
  333.                 index++;
  334.                 createNewItem();
  335.             } else {
  336.                 itemList[index].x2 = e.getX();
  337.                 itemList[index].y2 = e.getY();
  338.             }
  339.             repaint();
  340.         }
  341. publicvoid mouseMoved(MouseEvent e) {
  342.             statusBar.setText("     Mouse Moved @:[" + e.getX() +
  343. ", " + e.getY() + "]");
  344.         }
  345.     }
  346. //選擇字型風格時候用到的事件偵聽器類,加入到字型風格的選擇框中
  347. privateclass checkBoxHandler implements ItemListener {
  348. publicvoid itemStateChanged(ItemEvent e) {
  349. if (e.getSource() == bold) {
  350. if (e.getStateChange() == ItemEvent.SELECTED) {
  351.                     f1 = Font.BOLD;
  352.                 } else {
  353.                     f1 = Font.PLAIN;
  354.                 }
  355.             }
  356. if (e.getSource() == italic) {
  357. if (e.getStateChange() == ItemEvent.SELECTED) {
  358.                     f2 = Font.ITALIC;
  359.                 } else {
  360.                     f2 = Font.PLAIN;
  361.                 }
  362.             }
  363.         }
  364.     }
  365. //畫圖面板類,用來畫圖
  366. class DrawPanel extends JPanel {
  367. public DrawPanel() {
  368.             setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  369.             setBackground(Color.white);
  370.             addMouseListener(new mouseA());
  371.             addMouseMotionListener(new mouseB());
  372.         }
  373. @Override
  374. publicvoid paintComponent(Graphics g) {
  375. super.paintComponent(g);
  376.             Graphics2D g2d = (Graphics2D) g;    //定義畫筆
  377. int j = 0;
  378. while (j <= index) {
  379.                 draw(g2d, itemList[j]);
  380.                 j++;
  381.             }
  382.         }
  383. void draw(Graphics2D g2d, drawings i) {
  384.             i.draw(g2d);//將畫筆傳入到各個子類中,用來完成各自的繪圖
  385.         }
  386.     }
  387. //新建一個畫圖基本單元物件的程式段
  388. void createNewItem() {
  389. if (currentChoice == 14)//進行相應的遊標設定
  390.         {
  391.             drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
  392.         } else {
  393.             drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  394.         }
  395. switch (currentChoice) {
  396. case3:
  397.                 itemList[index] = new Pencil();
  398. break;
  399. case4:
  400.                 itemList[index] = new Line();
  401. break;
  402. case5:
  403.                 itemList[index] = new Rect();
  404. break;
  405. case6:
  406.                 itemList[index] = new fillRect();
  407. break;
  408. case7:
  409.                 itemList[index] = new Oval();
  410. break;
  411. case8:
  412.                 itemList[index] = new fillOval();
  413. break;
  414. case9:
  415.                 itemList[index] = new Circle();
  416. break;
  417. case10:
  418.                 itemList[index] = new fillCircle();
  419. break;
  420. case11:
  421.                 itemList[index] = new RoundRect();
  422. break;
  423. case12:
  424.                 itemList[index] = new fillRoundRect();
  425. break;
  426. case13:
  427.                 itemList[index] = new Rubber();
  428. break;
  429. case14:
  430.                 itemList[index] = new Word();
  431. break;
  432.         }
  433.         itemList[index].type = currentChoice;
  434.         itemList[index].R = R;
  435.         itemList[index].G = G;
  436.         itemList[index].B = B;
  437.         itemList[index].stroke = stroke;
  438.     }
  439. //選擇當前顏色程式段
  440. publicvoid chooseColor() {
  441.         color = JColorChooser.showDialog(MiniDrawPad.this,
  442. "Choose a color", color);
  443.         R = color.getRed();
  444.         G = color.getGreen();
  445.         B = color.getBlue();
  446.         itemList[index].R = R;
  447.         itemList[index].G = G;
  448.         itemList[index].B = B;
  449.     }
  450. //選擇當前線條粗細程式段
  451. publicvoid setStroke() {
  452.         String input;
  453.         input = JOptionPane.showInputDialog(
  454. "Please input a float stroke value! ( >0 )");
  455.         stroke = Float.parseFloat(input);
  456.         itemList[index].stroke = stroke;
  457.     }
  458. //儲存圖形檔案程式段
  459. publicvoid saveFile() {
  460.         JFileChooser fileChooser = new JFileChooser();
  461.         fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
  462. int result = fileChooser.showSaveDialog(this);
  463. if (result == JFileChooser.CANCEL_OPTION) {
  464. return;
  465.         }
  466.         File fileName = fileChooser.getSelectedFile();
  467.         fileName.canWrite();
  468. if (fileName == null || fileName.getName().equals("")) {
  469.             JOptionPane.showMessageDialog(fileChooser, "Invalid File Name",
  470. "Invalid File Name", JOptionPane.ERROR_MESSAGE);
  471.         } else {
  472. try {
  473.                 fileName.delete();
  474.                 FileOutputStream fos = new FileOutputStream(fileName);
  475.                 output = new ObjectOutputStream(fos);
  476.                 drawings record;
  477.                 output.writeInt(index);
  478. for (int i = 0; i < index; i++) {
  479.                     drawings p = itemList[i];
  480.                     output.writeObject(p);
  481.                     output.flush();    //將所有圖形資訊強制轉換成父類線性化儲存到檔案中
  482.                 }
  483.                 output.close();
  484.                 fos.close();
  485.             } catch (IOException ioe) {
  486.                 ioe.printStackTrace();
  487.             }
  488.         }
  489.     }
  490. //開啟一個圖形檔案程式段
  491. publicvoid loadFile() {
  492.         JFileChooser fileChooser = new JFileChooser();
  493.         fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
  494. int result = fileChooser.showOpenDialog(this);
  495. if (result == JFileChooser.CANCEL_OPTION) {
  496. return;
  497.         }
  498.         File fileName = fileChooser.getSelectedFile();
  499.         fileName.canRead();
  500. if (fileName == null || fileName.getName().equals("")) {
  501.             JOptionPane.showMessageDialog(fileChooser, "Invalid File Name",
  502. "Invalid File Name", JOptionPane.ERROR_MESSAGE);
  503.         } else {
  504. try {
  505.                 FileInputStream fis = new FileInputStream(fileName);
  506.                 input = new ObjectInputStream(fis);
  507.                 drawings inputRecord;
  508. int countNumber = 0;
  509.                 countNumber = input.readInt();
  510. for (index = 0; index < countNumber; index++) {
  511.                     inputRecord = (drawings) input.readObject();
  512.                     itemList[index] = inputRecord;
  513.                 }
  514.                 createNewItem();
  515.                 input.close();
  516.                 repaint();
  517.             } catch (EOFException endofFileException) {
  518.                 JOptionPane.showMessageDialog(this"no more record in file",
  519. "class not found", JOptionPane.ERROR_MESSAGE);
  520.             } catch (ClassNotFoundException classNotFoundException) {
  521.                 JOptionPane.showMessageDialog(this"Unable to Create Object",
  522. "end of file", JOptionPane.ERROR_MESSAGE);
  523.             } catch (IOException ioException) {
  524.                 JOptionPane.showMessageDialog(this"error during read from file",
  525. "read Error", JOptionPane.ERROR_MESSAGE);
  526.             }
  527.         }
  528.     }
  529. //新建一個檔案程式段
  530. publicvoid newFile() {
  531.         index = 0;
  532.         currentChoice = 3;
  533.         color = Color.black;
  534.         stroke = 1.0f;
  535.         createNewItem();
  536.         repaint();//將有關值設定為初始狀態,並且重畫
  537.     }
  538. //主函式段
  539. publicstaticvoid main(String args[]) {
  540. try {
  541.             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  542.         } catch (Exception e) {
  543.         }//將介面設定為當前windows風格
  544.         MiniDrawPad newPad = new MiniDrawPad();
  545.         newPad.addWindowListener(
  546. new WindowAdapter() {
  547. publicvoid windowClosing(WindowEvent e) {
  548.                         System.exit(0);
  549.                     }
  550.                 });
  551.     }
  552. }
  553. class drawings implements Serializable//父類,基本圖形單元,用到序列化介面,儲存時所用
  554. {
  555. int x1, y1, x2, y2; //定義座標屬性
  556. int R, G, B;        //定義色彩屬性
  557. float stroke;       //定義線條粗細屬性
  558. int type;       //定義字型屬性
  559.     String s1;
  560.     String s2;      //定義字型風格屬性
  561. void draw(Graphics2D g2d) {
  562.     }
  563.     ;//定義繪圖函式
  564. }
  565. /*******************************************************************************
  566. 下面是各種基本圖形單元的子類,都繼承自父類drawings,請仔細理解繼承的概念
  567.  ********************************************************************************/
  568. class Line extends drawings //直線類
  569. {
  570. void draw(Graphics2D g2d) {
  571.         g2d.setPaint(new Color(R, G, B));
  572.         g2d.setStroke(new BasicStroke(stroke,
  573.                 BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
  574.         g2d.drawLine(x1, y1, x2, y2);
  575.     }
  576. }
  577. class Rect extends drawings//矩形類
  578. {
  579. void draw(Graphics2D g2d) {
  580.         g2d.setPaint(new Color(R, G, B));
  581.         g2d.setStroke(new BasicStroke(stroke));
  582.         g2d.drawRect(Math.min(x1, x2), Math.min(y1, y2),
  583.                 Math.abs(x1 - x2), Math.abs(y1 - y2));
  584.     }
  585. }
  586. class fillRect extends drawings//實心矩形類
  587. {
  588. void draw(Graphics2D g2d) {
  589.         g2d.setPaint(new Color(R, G, B));
  590.         g2d.setStroke(new BasicStroke(stroke));
  591.         g2d.fillRect(Math.min(x1, x2), Math.min(y1, y2),
  592.                 Math.abs(x1 - x2), Math.abs(y1 - y2));
  593.     }
  594. }
  595. class Oval extends drawings//橢圓類
  596. {
  597. void draw(Graphics2D g2d) {
  598.         g2d.setPaint(new Color(R, G, B));
  599.         g2d.setStroke(new BasicStroke(stroke));
  600.         g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),
  601.                 Math.abs(x1 - x2), Math.abs(y1 - y2));
  602.     }
  603. }
  604. class fillOval extends drawings//實心橢圓
  605. {
  606. void draw(Graphics2D g2d) {
  607.         g2d.setPaint(new Color(R, G, B));
  608.         g2d.setStroke(new BasicStroke(stroke));
  609.         g2d.fillOval(Math.min(x1, x2), Math.min(y1, y2),
  610.                 Math.abs(x1 - x2), Math.abs(y1 - y2));
  611.     }
  612. }
  613. class Circle extends drawings//圓類
  614. {
  615. void draw(Graphics2D g2d) {
  616.         g2d.setPaint(new Color(R, G, B));
  617.         g2d.setStroke(new BasicStroke(stroke));
  618.         g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),
  619.                 Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),
  620.                 Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));
  621.     }
  622. }
  623. class fillCircle extends drawings//實心圓
  624. {
  625. void draw(Graphics2D g2d) {
  626.         g2d.setPaint(new Color(R, G, B));
  627.         g2d.setStroke(new BasicStroke(stroke));
  628.         g2d.fillOval(Math.min(x1, x2), Math.min(y1, y2),
  629.                 Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),
  630.                 Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));
  631.     }
  632. }
  633. class RoundRect extends drawings//圓角矩形類
  634. {
  635. void draw(Graphics2D g2d) {
  636.         g2d.setPaint(new Color(R, G, B));
  637.         g2d.setStroke(new BasicStroke(stroke));
  638.         g2d.drawRoundRect(Math.min(x1