如果没有这样的方法,有的办法可以代替那?主要是在一个面板上可以draw各种图形,然后双击某个(每个图形都是独立的)图形会到另一个面板上绘制出来,在这个面板上可以像拼图一样拖拽摆放删除等功能!

解决方案 »

  1.   

    class Drawing extends JPanel {
    BufferedImage image;
    Drawing(){
    image = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
    Graphics2D  g2d = (Graphics2D)image.getGraphics();
    g2d.draw...;
    } public Image getImage(){
    return image;
    } public void paintComponent(Graphics g){
    g.drawImage(image,0,0,null);
    }
    }
      

  2.   


     image = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
    抛出异常啊!
    java.lang.reflect.InvocationTargetException
    这是什么啊?
      

  3.   

    你可以写一个MyPanel extends JPanel
    如果你想做到每个元素都可以拖拉,实际上你就应该先记录总共有哪些元素。然后在paint方法中先清空再将列表中的所有元素重画一次
      

  4.   


    嘿嘿你说的我也不懂~我是初学者!我在网上找的画板程序~想把它画出来的图形进行操作!package bagone;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.Point2D;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    import javax.swing.border.Border;public class DrawShapes extends JFrame {
        private static final long serialVersionUID = 3685715844170953607L;
        // 作图面板
        private CVS cvs;
        // 作图方式选择按钮
        private JToggleButton cycle, line, rect,arc,rgb;
        private JLabel red, blue, green;
        private ButtonGroup bgroup;
        // 按钮布局面板
        private JPanel menuPanel;
        // 复位按钮
        private JButton clean;
        
        private JColorChooser chooser = null;
        
        static Color c = new Color(0, 0, 0);    public DrawShapes() {
            super("Java");
            // this.setResizable(false);
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setSize(640, 480);
            this.setLocationRelativeTo(null);
            this.getContentPane().add(cvs = new CVS());
            this.initComponents();
        }    // 初始化组件
        private void initComponents() {
            this.menuPanel = new JPanel(null);
            this.menuPanel.setPreferredSize(new Dimension(400, 28));
            this.menuPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
            this.getContentPane().add(this.menuPanel, "South");
            this.bgroup = new ButtonGroup();
            this.cycle = new JToggleButton("圆形");
            this.cycle.setBounds(20, 4, 68, 20);
            this.line = new JToggleButton("直线");
            this.line.setBounds(100, 4, 68, 20);
            this.rect = new JToggleButton("矩形");
            this.rect.setBounds(180, 4, 68, 20);
            this.arc = new JToggleButton("扇形");
            this.arc.setBounds(260, 4, 68, 20);
            this.rgb = new JToggleButton("颜色");
            this.rgb.setBounds(340, 4, 68, 20);
            red = new JLabel();
            red.setOpaque(true);
            red.setBackground(Color.red);
            red.setBounds(258+300, 4, 20, 20);
            blue = new JLabel();
            blue.setOpaque(true);
            blue.setBackground(Color.blue);
            blue.setBounds(282+300, 4, 20, 20);
            green = new JLabel();
            green.setBackground(Color.green);
            green.setOpaque(true);
            green.setBounds(306+300, 4, 20, 20);
            this.menuPanel.add(cycle);
            this.menuPanel.add(line);
            this.menuPanel.add(rect);
            this.menuPanel.add(rgb);
            this.menuPanel.add(arc);
            this.bgroup.add(cycle);
            this.bgroup.add(line);
            this.bgroup.add(rect);
            this.bgroup.add(rgb);
            this.bgroup.add(arc);
            this.clean = new JButton("清除");
            this.clean.setBounds(420, 4, 68, 20);
            this.menuPanel.add(clean);
            // 按钮动作侦听器实例
            ActionListener al = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
    Object src = e.getSource();
    if (src.equals(cycle)) {
    cvs.DRAWSTATE=cvs.CYCLE;
    } else if (src.equals(line)) {
    cvs.DRAWSTATE=cvs.LINE;// 画直线
    } else if (src.equals(rect)) {
    cvs.DRAWSTATE=cvs.RECTANGLE;
    // cvs.setSX(SXXX.RECTANGLE);// 画矩形
    } else if (src.equals(clean)) {
    cvs.reset();// 复位
    } else if (src.equals(arc)) {
    new SetArc();
    cvs.DRAWSTATE=cvs.ARC;
    } else if (src.equals(rgb)) {
    Color newColor = JColorChooser.showDialog(null, "调色板", c);
    c = newColor;
    }
    }
            };
            // 给按钮注册侦听器
            this.cycle.addActionListener(al);
            this.line.addActionListener(al);
            this.rect.addActionListener(al);
            this.clean.addActionListener(al);
            this.arc.addActionListener(al);
            this.rgb.addActionListener(al);
    //        MouseListener ml = new MouseAdapter() {
    //            public void mousePressed(MouseEvent e) {
    //                Object s = e.getSource();
    //                Border b = BorderFactory.createLoweredBevelBorder();
    //                if (s.equals(red)) {
    //                    red.setBorder(b);
    //                    blue.setBorder(null);
    //                    green.setBorder(null);
    //                } else if (s.equals(blue)) {
    //                    blue.setBorder(b);
    //                    red.setBorder(null);
    //                    green.setBorder(null);
    //                } else if (s.equals(green)) {
    //                    green.setBorder(b);
    //                    blue.setBorder(null);
    //                    red.setBorder(null);
    //                }
    //            }
    //        };
    //        blue.addMouseListener(ml);
    //        red.addMouseListener(ml);
    //        green.addMouseListener(ml);
        }    // 程序入口
        public static void main(String[] aregs) throws Exception {
            // 调用系统视觉设置
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new DrawShapes().setVisible(true);
                }
            });
        }
    }我改来改去也改不明白~~谁能帮我看看!!就是这个程序!
      

  5.   


    // 主作图面板类,可接收一般鼠标事件和鼠标拖动事件
    class CVS extends Canvas implements MouseListener, MouseMotionListener {
        private static final long serialVersionUID = 5585026114112579483L;    // 指定图形的第一点,比如矩形的角点,圆形的圆心,直线的第一点
        private int x, y;
        // 作图大小
        private int w, h;
        // 作图类型控制
        public int DRAWSTATE = 0;
        public final int CYCLE = 60, RECTANGLE = 61, LINE = 62, ARC = 63;
        // 双缓冲,背景缓冲区和临时缓冲区
        private BufferedImage background, buff;
        // 图像更新标记
        private boolean hasChanged;
        // 背景色,临时作图色,前景色
        private Color bgc = Color.white;
        public CVS() {
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
        }    // 绘制临时缓冲区
        private void drawing(int X, int Y) {
            Graphics g = buff.getGraphics();
            g.setColor(bgc);
            g.clearRect(0, 0, w, h);
            copyBuffer();
            g.setColor(DrawShapes.c);
            Point p = new Point(x, y);
            Point2D p2 = new Point2D.Double(X, Y);
            int dist = (int) p.distance(p2);
            int dx = x - X;
            dx = Math.abs(dx);
            int dy = y - Y;
            dy = Math.abs(dy);
            switch (DRAWSTATE) {
            case CYCLE:
             g.fillOval(x < X ? x : X, y < Y ? y : Y, dx, dy);
                break;
            case LINE:
                g.drawLine(x, y, X, Y);
                break;
            case RECTANGLE:
                g.fillRect(x < X ? x : X, y < Y ? y : Y, dx, dy);
                break;
            case ARC:
                g.fillArc(x < X ? x : X, y < Y ? y : Y, dx, dy,SetArc.ArcA,SetArc.ArcB);
             break;
            }
            g.dispose();
            drawBufferToCVS();
        }
        // 绘制背景缓冲区
        private void drawBuffer(int X, int Y) {
            Graphics2D gd = background.createGraphics();
            gd.setColor(DrawShapes.c);
            gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            Point p = new Point(x, y);
            Point2D p2 = new Point2D.Double(X, Y);
            int dist = (int) p.distance(p2);
            int dx = x - X;
            dx = Math.abs(dx);
            int dy = y - Y;
            dy = Math.abs(dy);
            switch (DRAWSTATE) {
            case CYCLE:
             //画正圆
             gd.fillOval(x < X ? x : X, y < Y ? y : Y, dx, dy);
                break;
            case LINE:
                gd.drawLine(x, y, X, Y);
                break;
            case RECTANGLE:
                gd.fillRect(x < X ? x : X, y < Y ? y : Y, dx, dy);
                break;
            case ARC:
              gd.fillArc(x < X ? x : X, y < Y ? y : Y, dx, dy,SetArc.ArcA,SetArc.ArcB);
             break;
            default:
                popupMsg();
            }
            gd.dispose();
            Graphics g = this.getGraphics();
            g.clearRect(0, 0, w, h);
            g.drawImage(background, 0, 0, null);
            g.dispose();
        }    private void popupMsg() {
            JOptionPane.showMessageDialog(this, "请选择一种作图方式开始作图.");
        }    // 复制背景缓冲区内容到临时缓冲区
        private void copyBuffer() {
            Graphics g = buff.getGraphics();
            g.drawImage(background, 0, 0, null);
            g.dispose();
        }    // 印出临时缓冲区内容到窗口
        private void drawBufferToCVS() {
            Graphics g = this.getGraphics();
            g.drawImage(buff, 0, 0, null);
            System.out.println(" buff : " + buff.getWidth()+" " + buff.getHeight());
            g.dispose();
        }    // 清除双缓冲区并清除窗口内容
        public void reset() {
            clearContents(buff);
            clearContents(background);
            Graphics g = this.getGraphics();
            g.setColor(bgc);
            g.fillRect(0, 0, w, h);
            g.dispose();
        }    // 清除指定缓冲区内容
        private void clearContents(BufferedImage i) {
            Graphics g = i.getGraphics();
            g.setColor(bgc);
            g.fillRect(0, 0, w, h);
            g.dispose();
        }    // 初始化缓冲区
        private void initImages() {
            background = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            buff = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            clearContents(background);
            clearContents(buff);
        }    // 重写此方法,以便在窗口重新显示时能正确显示最后的内容.
        public void paint(Graphics g) {
            if (background == null) {
                w = this.getToolkit().getScreenSize().width;
                h = this.getToolkit().getScreenSize().height;
                initImages();
            }
            g.drawImage(background, 0, 0, null);
            g.dispose();
        }    // 双击作图区也能做清除动作,呵呵
        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2)
                reset();
        }    public void mouseEntered(MouseEvent e) {
        }    public void mouseExited(MouseEvent e) {
        }    // 每当按下鼠标时就重新设置第一点的坐标
        public void mousePressed(MouseEvent e) {
            this.x = e.getX();
            this.y = e.getY();
        }    // 每当释放鼠标时就决定是否需要将背景缓冲区印出到窗口
        public void mouseReleased(MouseEvent e) {
            if (hasChanged) {
                hasChanged = false;
                drawBuffer(e.getX(), e.getY());
            }
        }    // 每当鼠标拖动时开始作图
        public void mouseDragged(MouseEvent e) {
            hasChanged = true;
            drawing(e.getX(), e.getY());
        }    public void mouseMoved(MouseEvent e) {
        }
    }