package mydraw;import javax.swing.*;import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;class MyDraw extends Frame implements ActionListener,MouseListener,MouseMotionListener,ItemListener
{
JFrame f;                   //定义窗口
SetCanvas cans;             //定义画布
JButton bt1[];              //定义工具栏按钮组
JButton bt2[];              //定义颜色栏按钮组
JButton bt3[];              //定义大小按钮组
JMenuItem mi1;              //定义“新建”菜单栏
JMenuItem mi2;              //定义“保存”菜单栏
JMenuItem mi3;              //定义“退出”菜单栏
 

Point dians[]=new Point[10000];       //点数组
int tool=0;                          //当前工具选择
int color=0;                         //当前颜色选择
int ls=0;                            //当前大小选择
int dian=0;                          //
int startx,starty,endx,endy,height,width,chanx,chany;      //记录开始结束坐标及图刑长宽
//Vector painInfo=null;

MyDraw()     //重构
{
JFrame f=new JFrame("未命名-画图");      //创建窗口
f.setSize(700,600);                     //设置窗口大小
Container con=f.getContentPane();       //创建容器
con.setLayout(null);                    //设置容器布局管理器

//painInfo=new Vector();

bt1=new JButton[6];                     //创建工具栏按钮
bt2=new JButton[8];                     //创建颜色栏按钮
bt3=new JButton[8];                     //创建大小按钮

//新建工具栏的标签
JLabel l1=new JLabel("【工具】",JLabel.CENTER);      
JLabel l2=new JLabel("【颜色】",JLabel.CENTER);      
JLabel l3=new JLabel("【大小】",JLabel.CENTER); 
//添加标签到容器中
con.add(l1);     
con.add(l2);        
con.add(l3);        
//设置标签位置
l1.setBounds(0,55,100,20);                
l2.setBounds(115,55,220,20);        
l3.setBounds(365,55,220,20);         

//新建菜单栏
JMenuBar mb=new JMenuBar();         
//新建菜单
JMenu menu1=new JMenu("文件");       
JMenu menu2=new JMenu("帮助");
//新建菜单项
mi1=new JMenuItem("新建");          
mi2=new JMenuItem("保存");
mi3=new JMenuItem("退出");


//为菜单项添加监听器
mi1.addActionListener(this);
mi2.addActionListener(this);
mi3.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
              System.exit(0);
            }
          });
//添加菜单项到菜单中
menu1.add(mi1);
menu1.add(mi2);
menu1.add(mi3);
mb.add(menu1);
mb.add(menu2);
f.setJMenuBar(mb);

//设置工具栏
JPanel panel1=new JPanel();
//新建工具栏
JToolBar toolBar1=new JToolBar("工具");
//垂直排列
toolBar1.setOrientation(SwingConstants.VERTICAL);
//设置为不可拖动
toolBar1.setFloatable(false);
//设置与边界的距离
toolBar1.setMargin(new Insets(10,2,2,2));
//设置布局方式
toolBar1.setLayout(new GridLayout(6,1,2,2));
bt1[0]=new JButton("消除");
bt1[1]=new JButton("擦除");
bt1[2]=new JButton("直线");
bt1[3]=new JButton("曲线");
bt1[4]=new JButton("矩形");
bt1[5]=new JButton("椭圆");
//依次为各个按钮添加事件监听器
for(int i=0;i<=5;i++)
{
toolBar1.add(bt1[i]);
bt1[i].addActionListener(this);
}
panel1.add(toolBar1);
//con.add(panel1,BorderLayout.WEST);
con.add(panel1);
panel1.setBounds(10, 65, 80, 220);

//设置颜色栏
JPanel panel2=new JPanel();
//新建一个JToolBar
JToolBar toolBar2=new JToolBar("颜色");
//设置为不可拖动
toolBar2.setFloatable(false);
//设置与边界的距离
toolBar2.setMargin(new Insets(2,2,2,2));
//设置布局方式
toolBar2.setLayout(new GridLayout(1,8,2,2));
bt2[0]=new JButton("红");
bt2[1]=new JButton("黄");
bt2[2]=new JButton("绿");
bt2[3]=new JButton("蓝");
bt2[4]=new JButton("黑");
bt2[5]=new JButton("白");
bt2[6]=new JButton("青");
bt2[7]=new JButton("紫");
//依次为各个按钮添加事件监听器
for(int i=0;i<=7;i++)
{
toolBar2.add(bt2[i]);
bt2[i].addActionListener(this);
}
panel2.add(toolBar2);
//con.add(panel2, BorderLayout.SOUTH);
//panel2.setBounds(100, 380, 220, 200);
con.add(panel2);
panel2.setBounds(115, 10, 220, 40);

//设置画线栏
JPanel panel3=new JPanel();
//新建一个JToolBar
JToolBar toolBar3=new JToolBar("画线粗细");
//设置为不可拖动
toolBar3.setFloatable(false);
//设置与边界的距离
toolBar3.setMargin(new Insets(2,2,2,2));
//设置布局方式
toolBar3.setLayout(new GridLayout(1,8,2,2));
bt3[0]=new JButton("1");
bt3[1]=new JButton("2");
bt3[2]=new JButton("3");
bt3[3]=new JButton("4");
bt3[4]=new JButton("5");
bt3[5]=new JButton("6");
bt3[6]=new JButton("7");
bt3[7]=new JButton("8");
//依次为各个按钮添加事件监听器
for(int i=0;i<=7;i++)
{
toolBar3.add(bt3[i]);
bt3[i].addActionListener(this);
}
panel3.add(toolBar3);
//con.add(panel3, BorderLayout.NORTH);
con.add(panel3);
panel3.setBounds(365, 10,220,40);

//创建画布
    cans=new SetCanvas();
    //设置画布背景颜色
cans.setBackground(Color.white);
//添加画布监听器
cans.addMouseListener(this);
cans.addMouseMotionListener(this);
//添加画布到容器中
con.add(cans);
cans.setBounds(100, 80,500,400);

f.setVisible(true);
}

//获取事件信息同时设置相应的工具、颜色、大小
public void actionPerformed(ActionEvent e)
{
JButton bu=(JButton)e.getSource();
{
for(int i=0;i<6;i++)
if(bu==bt1[i]) tool=i;
for(int j=0;j<8;j++)
if(bu==bt2[j]) color=j;
for(int g=0;g<8;g++)
if(bu==bt3[g]) ls=g;
}


}

//设置画布类
class SetCanvas extends Canvas
{
public void paint(Graphics g)
    {
        //新建图像
        Graphics2D g2 = (Graphics2D)g;
        //选择颜色
        switch(color)                          
         {
          case 0: g2.setPaint(Color.red);break;
          case 1: g2.setPaint(Color.yellow);break;
          case 2: g2.setPaint(Color.green);break;
          case 3: g2.setPaint(Color.blue);break;
          case 4: g2.setPaint(Color.black);break;
          case 5: g2.setPaint(Color.white);break;
          case 6: g2.setPaint(Color.cyan);break;
          case 7: g2.setPaint(Color.magenta);break;
         }
        //选择大小
         switch(ls)                      
         {
          case 0: g2.setStroke(new BasicStroke(1));break;
          case 1: g2.setStroke(new BasicStroke(3));break;
          case 2: g2.setStroke(new BasicStroke(5));break;
          case 3: g2.setStroke(new BasicStroke(7));break;
          case 4: g2.setStroke(new BasicStroke(9));break;
          case 5: g2.setStroke(new BasicStroke(11));break;
          case 6: g2.setStroke(new BasicStroke(13));break;
          case 7: g2.setStroke(new BasicStroke(15));break;
          //case 8: g2.setStroke(new BasicStroke(19));break;
      }
         
      //选择工具
      if(tool==0)
      {
       g2.clearRect(0,0,getSize().width,getSize().height);
      }
      if(tool==1)
      {
          g2.setPaint(Color.white);
       for(int i=0;i<dian-1;i++)
  g2.draw(new Line2D.Double(dians[i],dians[i+1])); 
      }
      if(tool==2)
      {
             g2.draw(new Line2D.Double(startx,starty,endx,endy));
      }
      if(tool==3)
      {
       for(int i=0;i<dian-1;i++)
      g2.draw(new Line2D.Double(dians[i],dians[i+1])); 
      }
      if(tool==4)
      {
        g2.draw(new Rectangle2D.Double(startx,starty,width,height));
      }
      if(tool==5)
      {
       g2.draw(new Ellipse2D.Double(startx,starty,width,height));
      }
    } 
public void update(Graphics g)
    {
      paint(g); 
    }
}


public void itemStateChanged(ItemEvent e) 
{

    }
    public void mouseDragged(MouseEvent e) 
    {
        if(tool==3||tool==1)
        {
           dians[dian] = new Point(e.getX(),e.getY());
           dian++;
           cans.repaint();
        }
    }
    public void mouseMoved(MouseEvent e)
    {

    }
    public void mouseClicked(MouseEvent e)
    {
    
    }
    public void mousePressed(MouseEvent e)
    {
     if(tool!=3)                                                                                                                                                                                           
        startx=e.getX();
        starty=e.getY();
    }
    public void mouseReleased(MouseEvent e)
    { 
        if(tool==3||tool==1)
       dian=0;
       else
       {
         endx=e.getX();
           endy=e.getY();
       if(tool!=2)
        {   
        if((endx-startx)>=2)
         {
          width=endx-startx;
          if((endy-starty)>=2)
           height=endy-starty;
          else
           {
            height=starty-endy;
            starty=endy;
           }
         }
       else
         {
            width=startx-endx;
           if((endy-starty)>=2)
            {
              height=endy-starty;
              startx=endx;
             }
           else
            {
              height=starty-endy;
              startx=endx;
              starty=endy;
             }
           
          }
        } 
         cans.repaint();
       }
     }
    public void mouseEntered(MouseEvent e)
    {
    
    }
    public void mouseExited(MouseEvent e)
    {
    
    }
    public static void main(String args[])
    {
     new MyDraw();    //创建对象
    }
}

解决方案 »

  1.   

    你说的是不是在保存前面加个小图片,如果是的话可以这样mi2=new JMenuItem("保存", new ImageIcon("images/save.gif"));图片记得放在images文件夹下
      

  2.   

    不是,是要将绘图结果保存为jpg和bmp格式。
      

  3.   

    把你的图用Graphics2D 画到一个BufferedIamge中
    再用ImageIO.write(RenderedImage im, String formatName, File output)
    方法输出到图片
    该方法使用样例:
    BufferedIamge bi = new BufferedImage(width,height,BufferedImage.TYPE_4BYTE_ABGR);
    Graphics2D g2d = (Graphics2D) bi.getGraphics();
    g2d....你的画图过程,
    ImageIO.write(bi, "png", new File("D:/1.jpg"));
      

  4.   

    还是不行哦,把class SetCanvas extends Canvas中的Graphics2D g2 = (Graphics2D)g;
    换成Graphics2D g2 = (Graphics2D) bi.getGraphics();后就没办法画图了。
    能说下具体应该怎么改吗?
      

  5.   

    先把图画到bi上,再把这个bi话到Canvas上不就行了
    你不要把Canvas中的Graphics2D g2 = (Graphics2D)g;
    换成Graphics2D g2 = (Graphics2D) bi.getGraphics();
    而是用两个不同的引用,
    Graphics2D g2 = (Graphics2D)g;//Canvas中的
    Graphics2D g2_b = (Graphics2D) bi.getGraphics();
    g2_b....你的画图过程,
    g2.drawImage(bi,0,0,null);//往Canvas上画
      

  6.   

    我在前面加了定义BufferedImage bi = new BufferedImage(cans.WIDTH,cans.HEIGHT,BufferedImage.TYPE_4BYTE_ABGR);
    后面按你说的在Mydraw构造函数里加了个方法
    public void draw()

        Graphics2D g2 = (Graphics2D) bi.getGraphics();
       g2...画图过程
     }
    然后在SetCanvas里改成
    class SetCanvas extends Canvas
       {
        public void paint(Graphics g)
         {
           draw();
           Graphics2D g3 = (Graphics2D)g;
           g3.drawImage(bi,0,0,null);
         }
        public void update(Graphics g)
         {
           paint(g); 
         }
       }
    还是画不了东西哦。
    还有我给菜单项“保存”加了
    mi2.addActionListener(new ActionListener() 
      {
        public void actionPerformed(ActionEvent e) 
         {
          try 
           {
     ImageIO.write(bi, "png", new File("D:/1.jpg"));
            } catch (IOException e1) 
               {
                  e1.printStackTrace();
        }
          }
     });选中菜单项之后还是没反应哦。
    请问是哪里出错了呢?
      

  7.   

    楼主把你的程序改了下,看看吧import javax.imageio.ImageIO;
    import java.io.File;
    import java.io.IOException;import javax.swing.*;import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.BufferedImage;class MyDraw extends JFrame implements ActionListener {
    SetCanvas cans; // 定义画布
    JButton bt1[]; // 定义工具栏按钮组
    JButton bt2[]; // 定义颜色栏按钮组
    JButton bt3[]; // 定义大小按钮组
    JMenuItem mi1; // 定义“新建”菜单栏
    JMenuItem mi2; // 定义“保存”菜单栏
    JMenuItem mi3; // 定义“退出”菜单栏 Point dians[] = new Point[10000]; // 点数组
    int tool = 0; // 当前工具选择
    int color = 0; // 当前颜色选择
    int ls = 0; // 当前大小选择
    int dian = 0; //
    int startx, starty, endx, endy, height, width, chanx, chany; // 记录开始结束坐标及图刑长宽 public MyDraw() {
    super("画图");
    initialize();
    }

    private void initialize() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(700, 600); // 设置窗口大小
    Container con = getContentPane(); // 创建容器
    con.setLayout(null); // 设置容器布局管理器
    bt1 = new JButton[6]; // 创建工具栏按钮
    bt2 = new JButton[8]; // 创建颜色栏按钮
    bt3 = new JButton[8]; // 创建大小按钮 // 新建工具栏的标签
    JLabel l1 = new JLabel("【工具】", JLabel.CENTER);
    JLabel l2 = new JLabel("【颜色】", JLabel.CENTER);
    JLabel l3 = new JLabel("【大小】", JLabel.CENTER);
    // 添加标签到容器中
    con.add(l1);
    con.add(l2);
    con.add(l3);
    // 设置标签位置
    l1.setBounds(0, 55, 100, 20);
    l2.setBounds(115, 55, 220, 20);
    l3.setBounds(365, 55, 220, 20); // 新建菜单栏
    JMenuBar mb = new JMenuBar();
    // 新建菜单
    JMenu menu1 = new JMenu("文件");
    JMenu menu2 = new JMenu("帮助");
    // 新建菜单项
    mi1 = new JMenuItem("新建");
    mi2 = new JMenuItem("保存");
    mi3 = new JMenuItem("退出"); // 为菜单项添加监听器
    mi1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    cans.createNewBuff();
    }
    });
    mi2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    cans.save();
    }
    });
    mi3.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    System.exit(0);
    }
    });
    // 添加菜单项到菜单中
    menu1.add(mi1);
    menu1.add(mi2);
    menu1.add(mi3);
    mb.add(menu1);
    mb.add(menu2);
    setJMenuBar(mb); // 设置工具栏
    JPanel panel1 = new JPanel();
    // 新建工具栏
    JToolBar toolBar1 = new JToolBar("工具");
    // 垂直排列
    toolBar1.setOrientation(SwingConstants.VERTICAL);
    // 设置为不可拖动
    toolBar1.setFloatable(false);
    // 设置与边界的距离
    toolBar1.setMargin(new Insets(10, 2, 2, 2));
    // 设置布局方式
    toolBar1.setLayout(new GridLayout(6, 1, 2, 2));
    bt1[0] = new JButton("消除");
    bt1[1] = new JButton("擦除");
    bt1[2] = new JButton("直线");
    bt1[3] = new JButton("曲线");
    bt1[4] = new JButton("矩形");
    bt1[5] = new JButton("椭圆");
    // 依次为各个按钮添加事件监听器
    for (int i = 0; i <= 5; i++) {
    toolBar1.add(bt1[i]);
    bt1[i].addActionListener(this);
    }
    panel1.add(toolBar1);
    con.add(panel1);
    panel1.setBounds(10, 65, 80, 220); // 设置颜色栏
    JPanel panel2 = new JPanel();
    // 新建一个JToolBar
    JToolBar toolBar2 = new JToolBar("颜色");
    // 设置为不可拖动
    toolBar2.setFloatable(false);
    // 设置与边界的距离
    toolBar2.setMargin(new Insets(2, 2, 2, 2));
    // 设置布局方式
    toolBar2.setLayout(new GridLayout(1, 8, 2, 2));
    bt2[0] = new JButton("红");
    bt2[1] = new JButton("黄");
    bt2[2] = new JButton("绿");
    bt2[3] = new JButton("蓝");
    bt2[4] = new JButton("黑");
    bt2[5] = new JButton("白");
    bt2[6] = new JButton("青");
    bt2[7] = new JButton("紫");
    // 依次为各个按钮添加事件监听器
    for (int i = 0; i <= 7; i++) {
    toolBar2.add(bt2[i]);
    bt2[i].addActionListener(this);
    }
    panel2.add(toolBar2);
    con.add(panel2);
    panel2.setBounds(115, 10, 220, 40); // 设置画线栏
    JPanel panel3 = new JPanel();
    // 新建一个JToolBar
    JToolBar toolBar3 = new JToolBar("画线粗细");
    // 设置为不可拖动
    toolBar3.setFloatable(false);
    // 设置与边界的距离
    toolBar3.setMargin(new Insets(2, 2, 2, 2));
    // 设置布局方式
    toolBar3.setLayout(new GridLayout(1, 8, 2, 2));
    bt3[0] = new JButton("1");
    bt3[1] = new JButton("2");
    bt3[2] = new JButton("3");
    bt3[3] = new JButton("4");
    bt3[4] = new JButton("5");
    bt3[5] = new JButton("6");
    bt3[6] = new JButton("7");
    bt3[7] = new JButton("8");
    // 依次为各个按钮添加事件监听器
    for (int i = 0; i <= 7; i++) {
    toolBar3.add(bt3[i]);
    bt3[i].addActionListener(this);
    }
    panel3.add(toolBar3);
    con.add(panel3);
    panel3.setBounds(365, 10, 220, 40); // 创建画布
    cans = new SetCanvas();
    // 设置画布背景颜色
    cans.setBackground(Color.white);
    // 添加画布监听器
    // 添加画布到容器中
    con.add(cans);
    cans.setBounds(100, 80, 500, 400);
    cans.createNewBuff();
    setVisible(true);
    } // 获取事件信息同时设置相应的工具、颜色、大小
    public void actionPerformed(ActionEvent e) {
    JButton bu = (JButton) e.getSource();
    {
    for (int i = 0; i < 6; i++) {
    if (bu.equals(bt1[i])) {
    tool = i;
    }
    }
    for (int i = 0; i < 8; i++) {
    if (bu.equals(bt2[i])) {
    color = i;
    }
    }
    for (int i = 0; i < 8; i++) {
    if (bu.equals(bt3[i])) {
    ls = i;
    }
    }
    }
    } // 设置画布类
    class SetCanvas extends Canvas implements MouseListener, MouseMotionListener{
    private BufferedImage buffImg;
    private Graphics2D g2bi;
    private boolean newImg;

    SetCanvas() {
    super();
    initialize();
    }

    private void initialize() {
    addMouseListener(this);
    addMouseMotionListener(this);
    }

    public void createNewBuff() {
    buffImg = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
    g2bi = buffImg.createGraphics();
    g2bi.setBackground(Color.WHITE);
    newImg = true;
    repaint();
    }

    public void paint(Graphics g) {
    // 新建图像
    Graphics2D g2 = (Graphics2D) g;
    // 选择颜色
    switch (color) {
    case 0:
    g2bi.setPaint(Color.red);
    break;
    case 1:
    g2bi.setPaint(Color.yellow);
    break;
    case 2:
    g2bi.setPaint(Color.green);
    break;
    case 3:
    g2bi.setPaint(Color.blue);
    break;
    case 4:
    g2bi.setPaint(Color.black);
    break;
    case 5:
    g2bi.setPaint(Color.white);
    break;
    case 6:
    g2bi.setPaint(Color.cyan);
    break;
    case 7:
    g2bi.setPaint(Color.magenta);
    break;
    }
    // 选择大小
    switch (ls) {
    case 0:
    g2bi.setStroke(new BasicStroke(1));
    break;
    case 1:
    g2bi.setStroke(new BasicStroke(3));
    break;
    case 2:
    g2bi.setStroke(new BasicStroke(5));
    break;
    case 3:
    g2bi.setStroke(new BasicStroke(7));
    break;
    case 4:
    g2bi.setStroke(new BasicStroke(9));
    break;
    case 5:
    g2bi.setStroke(new BasicStroke(11));
    break;
    case 6:
    g2bi.setStroke(new BasicStroke(13));
    break;
    case 7:
    g2bi.setStroke(new BasicStroke(15));
    break;
    // case 8: g2.setStroke(new BasicStroke(19));break;
    } // 选择工具
    if (tool == 0) {
    g2bi.clearRect(0, 0, getSize().width, getSize().height);
    }
    if (tool == 1) {
    g2bi.setPaint(Color.white);
    for (int i = 0; i < dian - 1; i++)
    g2bi.draw(new Line2D.Double(dians[i], dians[i + 1]));
    }
    if (tool == 2) {
    g2bi.draw(new Line2D.Double(startx, starty, endx, endy));
    }
    if (tool == 3) {
    for (int i = 0; i < dian - 1; i++)
    g2bi.draw(new Line2D.Double(dians[i], dians[i + 1]));
    }
    if (tool == 4) {
    g2bi.draw(new Rectangle2D.Double(startx, starty, width, height));
    }
    if (tool == 5) {
    g2bi.draw(new Ellipse2D.Double(startx, starty, width, height));
    }
    if (newImg) {
    g2.clearRect(0, 0, getWidth(), getHeight());
    newImg = false;
    }
    g2.drawImage(buffImg, 0, 0, null);
    } public void update(Graphics g) {
    paint(g);
    }

    public void save() {
    try {
    ImageIO.write(buffImg, "png", new File("D:/1.jpg"));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public void mouseDragged(MouseEvent e) {
    if (tool == 3 || tool == 1) {
    dians[dian] = new Point(e.getX(), e.getY());
    dian++;
    repaint();
    }
    } public void mouseMoved(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) {
    if (tool != 3) {
    startx = e.getX();
    starty = e.getY();
    }
    } public void mouseReleased(MouseEvent e) {
    if (tool == 3 || tool == 1)
    dian = 0;
    else {
    endx = e.getX();
    endy = e.getY();
    if (tool != 2) {
    if ((endx - startx) >= 2) {
    width = endx - startx;
    if ((endy - starty) >= 2)
    height = endy - starty;
    else {
    height = starty - endy;
    starty = endy;
    }
    } else {
    width = startx - endx;
    if ((endy - starty) >= 2) {
    height = endy - starty;
    startx = endx;
    } else {
    height = starty - endy;
    startx = endx;
    starty = endy;
    } }
    }
    repaint();
    }
    } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { }
    } public static void main(String args[]) {
    new MyDraw(); // 创建对象
    }
    }
      

  8.   

    谢谢sunyiz,你改的程序把其他两个菜单项的功能都实现了。也谢谢还有其他几位的热心帮忙啊。