一个用JAVA写的画图程序

Java绘图 执行图像从源到目标的缩放,要将源矩形的第一个坐标映射到目标矩形的第一个坐标,源矩形的第二个坐标映射到目标矩形的第二个坐标,按需要缩放和翻转子图像,以保持这些映射关系。默认情况下,Graphics类使用的画笔属性是粗细为1个像素的正方形,而Graphics2D类可以调用setStroke()方法设置画笔的属性,如改变线条的粗细、虚实,定义线段端点的形状,风格等。使用Color类可以创建任意颜色的对象,不用担心平台是否支持该颜色,因为Java是以跨平台和与硬件无关的方式支持对颜色的管理。 阅读详情
 功能类似WINDOWS的画图程序,代码比较规范。对于刚刚接触图形界面开发的人很有帮助。(对我帮助也很大)

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import java.io.*;
  5. //定义画图的基本图形单元
  6. public class 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.     private int width = 800,  height = 550;    //定义画图区域初始大小
  63.     drawings[] itemList = new drawings[5000]; //用来存放基本图形的数组
  64.     private int 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.     private float 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.                     public void 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.                     public void 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.                     public void 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.                     public void 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.                     public void 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.                     public void 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.                     public void 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.                     public void actionPerformed(ActionEvent e) {
  191.                         newFile();
  192.                     }
  193.                 });
  194.         choices[1].addActionListener(
  195.                 new ActionListener() {
  196.                     public void actionPerformed(ActionEvent e) {
  197.                         loadFile();
  198.                     }
  199.                 });
  200.         choices[2].addActionListener(
  201.                 new ActionListener() {
  202.                     public void 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.                     public void 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(50, 20));
  229.         styles.setMaximumSize(new Dimension(100, 20));
  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.     public class ButtonHandler implements ActionListener {
  243.         public void 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.     public class ButtonHandler1 implements ActionListener {
  255.         public void 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.         public void 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.         public void 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.         public void mouseEntered(MouseEvent e) {
  317.             statusBar.setText("     Mouse Entered @:[" + e.getX() +
  318.                     ", " + e.getY() + "]");
  319.         }
  320.         public void mouseExited(MouseEvent e) {
  321.             statusBar.setText("     Mouse Exited @:[" + e.getX() +
  322.                     ", " + e.getY() + "]");
  323.         }
  324.     }
  325. //鼠标事件mouseB类继承了MouseMotionAdapter,用来完成鼠标拖动和鼠标移动时的相应操作
  326.     class mouseB extends MouseMotionAdapter {
  327.         public void 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.         public void mouseMoved(MouseEvent e) {
  342.             statusBar.setText("     Mouse Moved @:[" + e.getX() +
  343.                     ", " + e.getY() + "]");
  344.         }
  345.     }
  346. //选择字体风格时候用到的事件侦听器类,加入到字体风格的选择框中
  347.     private class checkBoxHandler implements ItemListener {
  348.         public void 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.         public void 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.             case 3:
  397.                 itemList[index] = new Pencil();
  398.                 break;
  399.             case 4:
  400.                 itemList[index] = new Line();
  401.                 break;
  402.             case 5:
  403.                 itemList[index] = new Rect();
  404.                 break;
  405.             case 6:
  406.                 itemList[index] = new fillRect();
  407.                 break;
  408.             case 7:
  409.                 itemList[index] = new Oval();
  410.                 break;
  411.             case 8:
  412.                 itemList[index] = new fillOval();
  413.                 break;
  414.             case 9:
  415.                 itemList[index] = new Circle();
  416.                 break;
  417.             case 10:
  418.                 itemList[index] = new fillCircle();
  419.                 break;
  420.             case 11:
  421.                 itemList[index] = new RoundRect();
  422.                 break;
  423.             case 12:
  424.                 itemList[index] = new fillRoundRect();
  425.                 break;
  426.             case 13:
  427.                 itemList[index] = new Rubber();
  428.                 break;
  429.             case 14:
  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.     public void 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.     public void 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.     public void 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.     public void 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.     public void newFile() {
  531.         index = 0;
  532.         currentChoice = 3;
  533.         color = Color.black;
  534.         stroke = 1.0f;
  535.         createNewItem();
  536.         repaint();//将有关值设置为初始状态,并且重画
  537.     }
  538. //主函数段
  539.     public static void 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.                     public void 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, x2), Math.min(y1, y2),
  639.                 Math.abs(x1 - x2), Math.abs(y1 - y2),
  640.                 50, 35);
  641.     }
  642. }
  643. class fillRoundRect extends drawings//实心圆角矩形类
  644. {
  645.     void draw(Graphics2D g2d) {
  646.         g2d.setPaint(new Color(R, G, B));
  647.         g2d.setStroke(new BasicStroke(stroke));
  648.         g2d.fillRoundRect(Math.min(x1, x2), Math.min(y1, y2),
  649.                 Math.abs(x1 - x2), Math.abs(y1 - y2),
  650.                 50, 35);
  651.     }
  652. }
  653. class Pencil extends drawings//随笔画类
  654. {
  655.     void draw(Graphics2D g2d) {
  656.         g2d.setPaint(new Color(R, G, B));
  657.         g2d.setStroke(new BasicStroke(stroke,
  658.                 BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
  659.         g2d.drawLine(x1, y1, x2, y2);
  660.     }
  661. }
  662. class Rubber extends drawings//橡皮擦类
  663. {
  664.     void draw(Graphics2D g2d) {
  665.         g2d.setPaint(new Color(255, 255, 255));
  666.         g2d.setStroke(new BasicStroke(stroke + 4,
  667.                 BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
  668.         g2d.drawLine(x1, y1, x2, y2);
  669.     }
  670. }
  671. class Word extends drawings//输入文字类
  672. {
  673.     void draw(Graphics2D g2d) {
  674.         g2d.setPaint(new Color(R, G, B));
  675.         g2d.setFont(new Font(s2, x2 + y2, ((int) stroke) * 18));
  676.         if (s1 != null) {
  677.             g2d.drawString(s1, x1, y1);
  678.         }
  679.     }
  680. }

Java实现画图软件(Swing) Swing画图软件 阅读详情

相关推荐

Java项目——画图软件

简介 作者简介:青铜码农,和大多数同学一样从零开始一步步学习,一步步积累。期待您的关注,让我们一起成长~注:本人学疏才浅,文章如有错误之处,敬请指正~ 本章节内容简介:仿Windows系统自带的画图工具。此项目包含了设置画笔粗细、选择画笔颜色、选择背景颜色、绘制图像、清除图像、使用橡皮擦、简笔画窗口等功能。 所需技术如下图: 功能预览: 画图完整版视频 功能结构: 搭建项目 01导入资源 02创建DrawPictureFrame窗体类 03创建DrawPictureCanv.

Waylon_Ma的博客 5587

用Java写一个画图工具

我们在每次画图时,每个图形都有一个对应的列表,即ArrayList类,直线的列表里面存了四个元素,分别为x1,y1,x2,y2,根据这两点的坐标即可复现直线。同理,矩形对应的列表也有四个元素,三角形对应的列表有六个元素(3个坐标),而多边形和曲线就有很多坐标。以下是一些要设置的量与构造函数。接下来我们实现画图功能,我们鼠标监听器的监听按照:按下->松开->点击 这个顺序直线:在第一次点击时,获得点击坐标,然后移动鼠标松开到终点。获得终点坐标即可将两点相连。

m0_74082519的博客 1916

JAVA简单画图程序

1.JFrame窗体界面(JButton、Graphics、Graphics2D、Color) 创建一个Draw类,在主函数中实例化Draw类,并调用Ondraw方法 public class Draw{ public static void main(String[] args) { //在主函数中,实例化Draw类的对象,调用初始化界面的方法 Dra...

qq1925346284的博客 2万+

Java学习—画图程序项目(2)

使用java进行画图程序的编写,记录并巩固对Java的学习。

weixin_51560236的博客 842

CVE-2025-25249漏洞深度解析:FortiOS认证绕过与实战缓解

远程代码执行(RCE)是网络安全中最危险的漏洞类型之一,其核心往往源于认证机制失效或内存安全缺陷。CVE-2025-25249正属于此类高危漏洞——它不依赖用户凭证,也不需要交互触发,而是通过超长HTTP头(如X-Forwarded-For)引发内存越界写入,直接绕过FortiOS和FortiSwitchManager的完整认证流程。该漏洞影响广泛、CVSS评分高达9.8,凸显了嵌入式设备在HTTP协议栈实现中的深层风险。在企业网络中,FortiGate等设备常作为边界守门人,一旦失陷将导致root级控制权

weixin_33694620的博客 524

自制非接触式静电探测仪:从振动电容原理到微弱信号检测实践

微弱信号检测是电子测量领域的核心挑战之一,尤其在需要避免物理接触或防止干扰的场景中。其基本原理在于将难以直接获取的微小物理量(如电流、电压)通过传感器转换为电信号,再经过放大、滤波等处理进行提取。锁相放大技术是解决这一问题的关键手段,它利用参考信号与目标信号的同步性,从强噪声背景中恢复出有效信息,极大提升了信噪比和测量灵敏度。这项技术的工程价值在于实现了对纳安级电流、微伏级电压等高难度参数的可靠测量。在静电防护、材料表面电位分析、生物电信号采集等应用场景中,非接触式测量需求广泛。本文聚焦的基于振动电容原理的

weixin_32349093的博客 273

用JAVA写一个画图小程序(JAVA 大作业)

JAVA GUI 编写画图程序,实现文件读取,图形绘画,颜色变换,粗细调整等等操作

bigBbug的博客 4020

基于AXI PCIE IP的FPGA PCIE卡示意图

如果在上图中的AXI互联IP上再连接一个带AXI Slave接口的BRAM控制器,这个BRAM控制器连接一个BRAM,Host PC在系统主存中分配了一些不连续的内存,Host PC可以将这些内存段的起始地址(当然要先转为PCIE总线地址)写到AXI总线上的BRAM中,这样AXI CDMA读取BRAM,将读取到的PCIE总线基地址写到AXIPCIE寄存器块中的AXIBAR2PCIEBAR_n寄存器中,这样就实现了SG DMA。通过动态改变AXIBAR2PCIEBAR_n寄存器的值,可以实现多通道DMA。

csdn_gddf102384398的博客 1623

用JAVA写一个画图程序(课程设计)

GUI设计,实现基本图形绘画、线条改变、橡皮擦、毛笔、喷枪、颜色调换、文件保存打开、窗口设计等功能

bigBbug的博客 5244

手把手教你用CEFSharp打造防关联指纹浏览器(附完整代码)

本文详细介绍了如何基于CEFSharp框架,从零开始构建一个企业级的防关联指纹浏览器。通过剖析核心架构、多进程隔离实现、动态指纹混淆(如Canvas、WebGL)的实战代码,以及代理集成与性能优化,为跨境电商、广告投放等场景提供了一套可控、安全的开源解决方案。

fern8的博客 961

WCK Operation (WCK 操作)

LPDDR6 SDRAM采用双时钟系统(WCK和CK),其中WCK频率是CK的两倍。为确保数据正确传输,需通过WCK2CK同步操作使两种时钟对齐。LPDDR6支持两种同步模式:Auto-sync off模式和WCK Always on模式,可通过MR22寄存器选择。同步操作由特定命令(Read/Write/MRR等)触发,需在满足特定时序参数(如tWCKENL、tWCKPRE等)后完成。同步前必须完成WCK2CK训练,且不同操作(读取/写入/CAS)有各自的时序要求。该机制确保数据在正确时钟相位下传输,是L

李家小院 649

自己写了一个简单的画图程序

没事儿了,正好上学期学了MFC,编写了一个简单的画图程序,大家可以下载看看

littlelove2013的专栏 979

heygem本地部署报错:SQLite3 can only bind numbers, strings, bigints, buffers, and null...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位大厂资深架构师和一线开发多年实战经验沉淀,

**My Coding Family** 3246

用JAVA制作一个画图程序

在日常生活中画图软件给我们带来了许多便利,往大了说可以用它来制作图标,往小了说也可以当做一个涂鸦板消磨时间。 比如:制作个图标 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190425163351182.png) ...

qq_44160107的博客 1万+

在 SAP 中修改 Profile 文件中的主机名需要谨慎操作,需需确保所有相关配置保持一致

在SAP系统中修改Profile文件主机名需谨慎操作,主要步骤包括:1)停止相关SAP服务;2)重命名并编辑实例级Profile文件(如ER1_D00_OLDHOST改为ER1_D00_LRPSAP),修改所有含旧主机名的参数;3)可选更新默认Profile文件;4)在Windows系统中调整注册表配置;5)验证一致性后重启服务。关键注意:保持大小写统一、修改前备份文件、集群环境需同步所有节点。通过系统日志确认新主机名生效且无报错。

金牌架构师 1049

python爬虫项目(一百九十八):电商平台用户行为数据分析与推荐系统、爬取电商平台用户行为数据

本文详细介绍了如何通过爬虫技术抓取电商平台的用户行为数据,并结合数据分析技术,构建一个简单的推荐系统。使用Selenium模拟用户操作抓取动态网页数据,并通过API接口直接获取用户行为数据,能够为后续的用户行为分析提供基础数据。我们结合了基于用户协同过滤、基于商品协同过滤和矩阵分解等方法,构建了不同的推荐系统。实际应用中,可以进一步优化推荐算法,利用更复杂的深度学习技术和更高效的数据处理方法,提升推荐的准确性和个性化程度。

斌擎科技 2361

用java写一个简易画图板

目标是实现一个简单的画板,可以通过点击上方的按钮改变要画的形状,颜色。大致效果如下图一、画图板界面实现所需用到的主要API类:JFrame,JButton,FlowLayout,Graphics以及一些相关的类;先创建窗体,设置相关属性,再添加按钮。import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;...

a784296404的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

用JAVA做一个简单的画图软件

#用JAVA做一个简单的画图软件 写在前面 第一次用Java写东西,未免有疏漏之处,请多多指正。 首先,建立画布。 这里利用JFrame窗体界面创建一个DrawerFrame类,在主函数中实例化DrawerFrame类,并调用showUI方法,画出程序的基本框架。 public class DrawerFrame { public static void main(String[] args){ DrawerFrame df= new DrawerFrame(); df.showUI(); }

qq_35677148的博客 5651

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

用java写一个简单的画图板

Hello,大家好,这是我的第二篇博客,写的是如何创作一个画图板;因为我以前写的代码都是用dev-C++写的控制台程序,这次学习了JFrame等容器,就想写个画图工具练练手,这一篇我讲的可能会细碎一点。 首先我们要做一个可视化界面,用JFrame类即可, ...

hnu_Cheng的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

画图程序 java_一个JAVA画图程序

近期根据视频教程搞了一个JAVA画图程序,做了一个太阳系模型的源码。涉及到一些AWT和面向对象的东西。详细来看一下吧。先来看一下效果吧: 基本的画图理论就省略了。要实现该程序关键有二个通用的程序:一、继承Frame的一个窗口初始化程序public class MyFrame extends Frame {public void LaunchFrame() {setSize(Constants.F...

weixin_33740934的博客 299

推荐两款程序员必备的画图神器

缘起 最近经常有伙伴问我,作为程序员,有没有好的画图工具推荐,领导说Microsoft Visio画图工具很强,让我们使用,但是我就是用的不习惯。还有没有其他高端的牛逼的,容易上手,一用就爽的画图工具么。 针对这么个问题,我其实也是经验不足,Microsoft Visio我也用过,安装包大,还要破解,用的不多,还买个正版,我的脑子还没瓦塌,我是不会买的。 那么趁着周末给大家分享两款好用的画图工具,作为程序员还是经常需要画一画图的,你应该能明白我说的画图指的是什么,我也就不过多的强调了。 还是强调下吧: 1、

阿飞云漫步 2万+

一个Java画图板程序的设计

本文讲述一个画图板应用程序的设计,屏幕抓图如下。这篇文章带有三个附件,其中两个jar文件都是j2sdk1.4.2_08编译打包,包含源代码,可执行,如下表: 附件名称及链接 详情 jDraw_basic.jar 本文是基

6567

Java画图程序设计

<br /><br />本文讲述一个画图板应用程序的设计,屏幕抓图如下:<br /><br />『IShape』<br />这是所有图形类(此后称作模型类)都应该实现接口,外部的控制类,比如画图板类就通过这个接口跟模型类“交流”。名字开头的I表示它是一个接口(Interface),这是eclipse用的一个命名法则,觉得挺有用的,就借鉴来了。这个接口定义了两个方法:<br /> view plaincopy to clipboardprint?public void draw(java.awt.Graphi

leoshime的专栏 2万+

Java中实现画图程序

图形的绘制与保存重绘

2401_88017330的博客 1436

如何用java创建一个画图板(一)

用java创建一个画图板,实现直线、矩形、圆的绘画。

qawsedplm的博客 1286
上一篇: 一个用JAVA写的贪食蛇实例
下一篇: 在论坛上看到一个洗牌算法觉得写的挺好
ocelight
博客等级 码龄19年 56粉丝 26原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值