设计的一个画图程序,想在拖动鼠标的时候可以即时显示矩形的大小,所以在mouseDragged()中使用了repaint()方法,在mouseReleased()中使用了paint()方法,但是这样只能画一个,再画时,之前的就全部清屏了,有什么别的方法可以达到我的目的吗?代码如下import java.awt.*;
import java.awt.event.*;
 
public class MyCanvas extends Canvas implements MouseMotionListener,MouseListener,ActionListener
{
 static int a,b,c,d; 
static MyCanvas mc;
 static Button bu[]=new Button[4]; public static void main(String args[])
 {
 mc=new MyCanvas();
 mc.addMouseListener(new MyCanvas());
 mc.addMouseMotionListener(new MyCanvas()); Frame f=new Frame("Test17"); Panel p1=new Panel(); bu[0]=new Button("铅笔");
bu[1]=new Button("直线");
bu[2]=new Button("矩形");
bu[3]=new Button("圆形");
for(int i=0;i<bu.length;i++)
 {
 bu[i].setEnabled(true);
 bu[i].addActionListener(new MyCanvas()); 
p1.add(bu[i]);
 } f.add(p1,BorderLayout.WEST);
 f.add(mc,BorderLayout.CENTER);
 f.pack();
 f.setVisible(true);
 }
 
public MyCanvas()
 {
 setSize(800,600);
 } public void paint(Graphics g)
 {
 if(!bu[0].isEnabled())
 g.drawLine(c,d,c,d);
 else if(!bu[1].isEnabled())
 g.drawLine(a,b,c,d);
 else if(!bu[2].isEnabled())
 g.drawRect(a,b,+(c-a),+(d-b)); 
}
 
public void mousePressed(MouseEvent e)
 {
 a=e.getX();
 b=e.getY();
 } public void mouseEntered(MouseEvent e){} public void mouseClicked(MouseEvent e){}
 
public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e)
 { 
c=e.getX();
 d=e.getY();
 Graphics g=mc.getGraphics();
 mc.paint(g);
 }
 
public void mouseDragged(MouseEvent e)
 {
 c=e.getX();
 d=e.getY();
 Graphics g=mc.getGraphics();
 mc.repaint();
 } public void mouseMoved(MouseEvent e){} public void actionPerformed(ActionEvent e)
 {
 for(int i=0;i<bu.length;i++)
 {
 bu[i].setEnabled(true);
 } Button but=(Button)e.getSource();
 but.setEnabled(false);
 }
}

解决方案 »

  1.   


    import java.awt.*;import java.awt.datatransfer.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.io.*;import javax.swing.*;
    import javax.swing.filechooser.FileFilter;import com.sun.image.codec.jpeg.*;@SuppressWarnings("serial")
    class ImagePanel extends JPanel
    {
        private BufferedImage image;    public ImagePanel(BufferedImage image)
        {
            this.image = image;
            prefSize();
        }    public void setImage(BufferedImage image)
        {
            this.image = image;
            prefSize();
            repaint();
        }    /**
         * 设置面板大小
         */
        private void prefSize()
        {
            this.setSize(image.getWidth(), image.getHeight());
        }    @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, null);
        }
    }/**
     * 文件类型
     */
    class ImageFilter extends FileFilter
    {    public boolean accept(File f)
        {
            if (f.isDirectory())
            {
                return true;
            }        String extension = getExtension(f);
            if (extension != null)
            {
                if (extension.equals("jpeg") || extension.equals("jpg")
                        || extension.equals("bmp"))
                {
                    return true;
                } else
                {
                    return false;
                }
            }        return false;
        }    public String getExtension(File f)
        {
            String ext = null;
            String s = f.getName();
            int i = s.lastIndexOf('.');        if (i > 0 && i < s.length() - 1)
            {
                ext = s.substring(i + 1).toLowerCase();
            }
            return ext;
        }    public String getDescription()
        {
            return "图片类型";
        }
    }
     
    public class CutScreen extends JFrame
    {
        private int x, y, w, h;
        private BufferedImage bufImage;
        private ImagePanel imagePanel;
        private Graphics g;
        private static Dimension screenDims;
        private GraphicsDevice gd = GraphicsEnvironment
                .getLocalGraphicsEnvironment().getDefaultScreenDevice();
        private JPopupMenu popup = new JPopupMenu();
        private JMenuItem[] popupm =
        { new JMenuItem("Copy"), new JMenuItem("Save"), new JMenuItem("Reset"),
                new JMenuItem("Exit") };
        private JFileChooser fileChooser = new JFileChooser();    public CutScreen()
        {        this.setLayout(new BorderLayout());
            this.add(buildControls());        // 设置标题
            this.setTitle("截图程序");
            // 去掉窗口的装饰
            this.setUndecorated(true);
            // 采用指定的窗口装饰风格
            this.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
            // 设置全屏
            gd.setFullScreenWindow(this);
            // 窗体始终靠前
            this.setAlwaysOnTop(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    }    private JComponent buildControls()
        {
            // 获取屏幕图像
            bufImage = getScreenImage();
            imagePanel = new ImagePanel(bufImage);        // 注册事件监听
            imagePanel.addMouseListener(new MouseAdapter()
            {            // 当鼠标按下时
                public void mousePressed(MouseEvent e)
                {
                    // 获取按下时的鼠标坐标
                    x = e.getX();
                    y = e.getY();
                }            public void mouseReleased(MouseEvent e)
                {
                    if (SwingUtilities.isLeftMouseButton(e))
                    {
                        // 设置截取图像的宽和高
                        w = Math.abs(x - e.getX());
                        h = Math.abs(y - e.getY());
                        if (w > 0 && h > 0)
                        {
                            g.drawLine(x, y, e.getX(), y);
                            g.drawLine(x, y, x, e.getY());
                            g.drawLine(x, e.getY(), e.getX(), e.getY());
                            g.drawLine(e.getX(), y, e.getX(), e.getY());
                            g.dispose();
                            popup.show(e.getComponent(), e.getX(), e.getY());
                        }
                    }
                }            public void mouseClicked(MouseEvent e){}
                public void mouseEntered(MouseEvent e){}
                public void mouseExited(MouseEvent e){}
            });
            imagePanel.addMouseMotionListener(new MouseMotionListener()
            {            // 当鼠标拖动时
                public void mouseDragged(MouseEvent e)
                {
                    if (SwingUtilities.isLeftMouseButton(e))
                    {
                        g = imagePanel.getGraphics();
                        g.setColor(Color.blue);
                        imagePanel.setImage(bufImage);                    g.drawLine(x, y, e.getX(), y);
                        g.drawLine(x, y, x, e.getY());
                        g.drawLine(x, e.getY(), e.getX(), e.getY());
                        g.drawLine(e.getX(), y, e.getX(), e.getY());
                    }
                }            public void mouseMoved(MouseEvent e)
                {
                }        });        popupm[0].addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                { // 复制到剪贴板
                    setClipboardImage(getAreaImage());
                    System.exit(0);
                }
            });
            popupm[1].addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    save();
                    System.exit(0);
                }
            });
            popupm[2].addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    imagePanel.setImage(bufImage);
                }
            });
            popupm[3].addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.exit(0);
                }
            });        this.addKeyListener(new KeyListener()
            {
                // 按Esc键退出
                public void keyPressed(KeyEvent e)
                {
                    if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
                    {
                        System.exit(0);
                    }
                }            public void keyReleased(KeyEvent e){}
                public void keyTyped(KeyEvent e){}
            });        for (int i = 0; i < popupm.length; i++)
            {
                popup.add(popupm[i]);
            }        fileChooser.addChoosableFileFilter(new ImageFilter());
            fileChooser.removeChoosableFileFilter(fileChooser
                    .getAcceptAllFileFilter());        return imagePanel;
        }    /**
         * 获取屏幕图像
         *
         * @return:返回BufferedImage对象
         */
        private BufferedImage getScreenImage()
        {
            Robot robot;
            try
            {
                robot = new Robot();
            } catch (Exception e)
            {
                throw new RuntimeException("unable to construct Robot");
            }
            // 获取屏幕尺寸
            screenDims = Toolkit.getDefaultToolkit().getScreenSize();        BufferedImage screen = robot.createScreenCapture(new Rectangle(0, 0,
                    screenDims.width, screenDims.height));        return screen;
        }    /**
         * 获取截图区域
         *
         * @return:返回BufferedImage对象
         */
        private BufferedImage getAreaImage()
        {
            return bufImage.getSubimage(x, y, w, h);
        }    private void save()
        {
            if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION)
            {
                save(fileChooser.getSelectedFile());
            }
        }    /**
         * 保存文件
         *
         * @param file:文件路径
         */
        private void save(File file)
        {
            BufferedOutputStream imageOut;
            try
            {
                imageOut = new BufferedOutputStream(new FileOutputStream(file));
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(imageOut);
                encoder.encode(getAreaImage());
            } catch (FileNotFoundException e)
            {
                e.printStackTrace();
            } catch (ImageFormatException e)
            {
                e.printStackTrace();
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }    /**
         * 复制到剪贴板
         *
         * @param image:BufferedImage对象
         */
        private void setClipboardImage(final BufferedImage image)
        {
            Transferable trans = new Transferable()
            {
                public DataFlavor[] getTransferDataFlavors()
                {
                    return new DataFlavor[]
                    { DataFlavor.imageFlavor };
                }            public boolean isDataFlavorSupported(DataFlavor flavor)
                {
                    return DataFlavor.imageFlavor.equals(flavor);
                }            public Object getTransferData(DataFlavor flavor)
                        throws UnsupportedFlavorException, IOException
                {
                    if (isDataFlavorSupported(flavor))
                        return image;
                    throw new UnsupportedFlavorException(flavor);
                }        };
            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,
                    null);
        }
        public static void main(String[] args)
        {        SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new CutScreen();
                }
            });
        }
    }研究研究这个
      

  2.   

    画图程序,首要的是能保存已画的东西,并在每次paint时按照先后顺序(下面的先画)重新repaint