JAVA2D绘图中怎么实现画的图象被选中?还有实现图象的移动?这个问题搞到我好痛苦!日思夜想!

解决方案 »

  1.   

    找了一个java的画图程序,希望有帮助;/*
     * 画图程序  来自bc-cn论坛
     * java applet  与windows自带的程序类似,功能简单
     * 
     * 
     */
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.util.Iterator;
    import java.util.LinkedList;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JColorChooser;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class Test extends JPanel implements Runnable,ActionListener,MouseListener,MouseMotionListener {
        
    private JButton clear,draw,replay,btnColor;//清除,开始画和重放和颜色的按钮
        Color choosedColor = Color.BLACK;//选中的颜色
        JDialog dialog = null;
        private LinkedList<MyShape> save;//保存起来的形状
        
        private int flag=0;//定义一个标志,用它来传递当前是在干什么
        private final int DRAW=1;//1代表当前正在画图
        private final int REPLAY=2;//2代表当前正在重放
        
        private LinkedList<Pen> ps;//保存点
        
        private volatile boolean go;
        /** Creates a new instance of Test */
        
        public Test() {
            initOther();
            initWindow();
        }
        
        private void initOther(){
            clear=new JButton("清除");
            draw=new JButton("开始画");
            replay=new JButton("重放");
            btnColor = new JButton("选取颜色");//选颜色
            
            clear.addActionListener(this);
            draw.addActionListener(this);
            replay.addActionListener(this);
            
            save=new LinkedList<MyShape>();
            ps=new LinkedList<Pen>();
            clear.setEnabled(false);
            replay.setEnabled(false);
        }
        private void initWindow(){
            JFrame jf=new JFrame("画板 Dream ");
            JPanel down=new JPanel();
            down.add(clear);
            down.add(draw);
            down.add(replay);
            down.add(btnColor);
            this.setBorder(BorderFactory.createTitledBorder("绘画区"));
            jf.add(this,BorderLayout.CENTER);
            jf.add(down,BorderLayout.SOUTH);
            jf.setSize(500,450);
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            btnColor.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e) 
                {
                    final JColorChooser chooser = new JColorChooser();
                    dialog = JColorChooser.createDialog(null, "选取颜色", false, chooser, new ActionListener()
                    {
                        public void actionPerformed(ActionEvent e) 
                        {
                            choosedColor = chooser.getColor();
                        }
                    }, null);
                    dialog.setVisible(true);
                }
            });
        }
        
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            if(flag==DRAW){
                for(MyShape my:save){
                    my.drawMe(g);
                }
                Point previous=null;
                for(Pen pp:ps){
                    Point p = pp.getP();
                    if(previous!=null)
                    {
                        Graphics2D g2 = (Graphics2D)g;
                        g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2));
                        g.setColor(pp.getColor());
                        g.drawLine(previous.x,previous.y,p.x,p.y);
                    }
                    previous=p;
                }
            }else if(flag==REPLAY){
                try{
                    for(MyShape my:save){
                        if(my.hasNext()){
                            my.drawNext(g);
                            return;
                        }else{
                            my.drawMe(g);
                        }
                    }
                    
                    for(MyShape my:save)
                   {
                        my.reset();
                    }
                    go=false;
                    replay.setEnabled(true);
                    draw.setEnabled(true);
                } catch(Exception exe){
                    exe.printStackTrace();
                }
            }
        }
        
        public void run(){
            while(go){
                try{
                    Thread.sleep(20);
                    repaint();
                } catch(Exception exe){
                    exe.printStackTrace();
                }
            }
            flag=DRAW;
            repaint();
        }
        
        public void actionPerformed(ActionEvent e) {
            Object source=e.getSource();
            if(source==clear){
                save.clear();
                replay.setEnabled(false);
                repaint();
            }else if(source==draw){
                flag=DRAW;
                this.addMouseListener(this);
                this.addMouseMotionListener(this);
                draw.setEnabled(false);
                clear.setEnabled(true);
            }else if(source==replay){
                flag=REPLAY;
                this.removeMouseListener(this);
                this.removeMouseMotionListener(this);
                replay.setEnabled(false);
                draw.setEnabled(false);
                clear.setEnabled(false);
                go=true;
                new Thread(this).start();
            }
        }
        public void mouseClicked(MouseEvent e) {
        }
        
        public void mousePressed(MouseEvent e) {
            Point p=e.getPoint();
            Pen pp = new Pen(p,choosedColor);
            replay.setEnabled(false);
            ps.offer(pp);
            repaint();
        }
        
        public void mouseReleased(MouseEvent e) {
            replay.setEnabled(true);
            Pen pp = new Pen(e.getPoint(),choosedColor);
            save.add(new MyLine(ps));
            ps=new LinkedList<Pen>();
            repaint();
        }
        
        public void mouseEntered(MouseEvent e) {
        }
        
        public void mouseExited(MouseEvent e) {
        }
        
        public void mouseDragged(MouseEvent e) {
            Pen pp = new Pen(e.getPoint(),choosedColor);
            ps.offer(pp);
            repaint();
        }
        
        public void mouseMoved(MouseEvent e) {
        }
        
        public static void main(String[] args) {
            new Test();
        }
    }
      

  2.   

    继续//定义了一个接口,它规定了重绘自己的方法
    interface MyShape{
        void drawMe(Graphics g);//一下子画出自己
        boolean hasNext();//是否还有下一个状态
        void drawNext(Graphics g);//画出自己下一个样子
        void reset();//重置一下
    }class Pen
    {
        private Point p;
        private Color color;
        Pen(Point p,Color color)
        {
            this.p = p;
            this.color = color;
        }
        public Color getColor() {
            return color;
        }
        public void setColor(Color color) {
            this.color = color;
        }
        public Point getP() {
            return p;
        }
        public void setP(Point p) {
            this.p = p;
        }
        
    }class MyLine implements MyShape{
        
        private LinkedList<Pen> ll;//用来保存点
        private Iterator<Pen> it;//一个迭代器
        private LinkedList<Pen> over;//保存已经画过的点
        
        public MyLine(LinkedList<Pen> ll){
            this.ll=ll;
            it=ll.iterator();
            over=new LinkedList<Pen>();
        }
        
        public void drawMe(Graphics g) 
        {
            Point previous=ll.getFirst().getP();
            for(Pen pp:ll){
                Point p = pp.getP();
                Graphics2D g2 = (Graphics2D)g;
                g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2));
                g.setColor(pp.getColor());
                g.drawLine(previous.x,previous.y,p.x,p.y);
                previous=p;
            }
        }
        
        public boolean hasNext() {
            return it.hasNext();
        }
        
        public void drawNext(Graphics g) 
        {    
            over.add(it.next());    
            Point previous=over.getFirst().getP();
            for(Pen pp:over){
                Point p = pp.getP();
                Graphics2D g2 = (Graphics2D)g;
                g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2));
                g.setColor(pp.getColor());
                g.drawLine(previous.x,previous.y,p.x,p.y);
                previous=p;
            }
        }
        
        public void reset(){
            it=ll.iterator();
            over.clear();
        }
    }
      

  3.   

    sunny3106(),那个my:save是什么意思啊 ?“:”这个字符是表达什么?有没人知道?
      

  4.   

    for(MyShape my:save){
                    my.drawMe(g);
    }
    for增强版与for-each相同功能,上面代码可以改为:
    for(int i=0;i<save.size();i++){
        MyShape my = save.get(i);
        my.drawMe(g);
    }
      

  5.   

    private LinkedList<MyShape> save;怎么编译错误的?
      

  6.   

    LinkedList<MyShape>:泛型(也有叫模板的),需要1.5或以上的JDK支持
      

  7.   

    如果是1.5以下版本的,private LinkedList<MyShape> save;这个需要怎么编译呢?
      

  8.   

    把<MyShape>去掉,但是後面很多地方都要進行“拆箱”,foreach也不可以再用了,比較麻煩。
    還是升級JDK吧,可以多學不少東西的。