java如何实现鼠标拖动绘制虚框矩形,在画出矩形后矩形虚拟边框消失,矩形中间填充颜色?.在线求答案,我就只有80分,全给了,求大神帮忙

解决方案 »

  1.   

    小例子,可以参考下:
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;import javax.swing.JFrame;
    import javax.swing.JLabel;public class RectLabel extends JLabel { private int x1 = 0;
    private int y1 = 0;
    private int x2 = 0;
    private int y2 = 0;
    private boolean current = true; public RectLabel() {
    super();
    addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent event) {
    Point p = event.getPoint();
    x1 = (int) p.getX();
    y1 = (int) p.getY();
    } public void mouseReleased(MouseEvent event) {
    Point p = event.getPoint();
    x2 = (int) p.getX();
    y2 = (int) p.getY();
    current = true;
    repaint();
    }
    });
    addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent event) {
    Point p = event.getPoint();
    x2 = (int) p.getX();
    y2 = (int) p.getY();
    current = false;
    repaint();
    }
    });
    } // 画圆的背景和标签
    protected void paintComponent(Graphics g) {
    if (!current)
    return;
    g.setColor(Color.red); g.fillRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
    Math.abs(y1 - y2)); super.paintComponent(g);
    } // 用简单的弧画按钮的边界。
    protected void paintBorder(Graphics g) {
    if (current)
    return;
    g.setColor(getForeground());
    g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
    Math.abs(y1 - y2));
    } public static void main(String[] args) {
    JLabel test = new RectLabel(); JFrame frame = new JFrame();
    frame.getContentPane().add(test);
    frame.setSize(300, 300);
    frame.setVisible(true);
    }
    }
      

  2.   

    我的目的是要做个类似于橡皮擦的功能,在Lable上放一张图片,然后再图片上拖动鼠标就画矩形填充背景色,例如这样:
      

  3.   

    我也没有好办法。
    想到一个:把所有画过的区域都存起来,每次重画都把它们都画一遍。
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Shape;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.geom.Rectangle2D;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JFrame;
    import javax.swing.JLabel;public class RectLabel extends JLabel { private int x1 = 0;
    private int y1 = 0;
    private int x2 = 0;
    private int y2 = 0;
    private boolean current = true;
    private List<Shape> list = new ArrayList<Shape>(); public RectLabel() {
    super();
    addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent event) {
    Point p = event.getPoint();
    x1 = (int) p.getX();
    y1 = (int) p.getY();
    } public void mouseReleased(MouseEvent event) {
    Point p = event.getPoint();
    x2 = (int) p.getX();
    y2 = (int) p.getY();
    list.add(new Rectangle2D.Double(Math.min(x1, x2), Math.min(y1,
    y2), Math.abs(x1 - x2), Math.abs(y1 - y2)));
    current = true;
    repaint();
    }
    });
    addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent event) {
    Point p = event.getPoint();
    x2 = (int) p.getX();
    y2 = (int) p.getY();
    current = false;
    repaint();
    }
    });
    } protected void paintComponent(Graphics g) {
    if (!current)
    return;
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.red);
    for (Shape s : list) {
    g2.fill(s);
    } } protected void paintBorder(Graphics g) {
    if (current)
    return;
    Graphics2D g2 = (Graphics2D) g;
    g.setColor(getForeground());
    for (Shape s : list) {
    g2.fill(s);
    }
    g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
    Math.abs(y1 - y2));
    } public static void main(String[] args) {
    JLabel test = new RectLabel(); JFrame frame = new JFrame();
    frame.getContentPane().add(test);
    frame.setSize(300, 300);
    frame.setVisible(true);
    }
    }
      

  4.   


    主面板,可以直接调用import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Stroke;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;import javax.swing.JPanel;public class DragDao extends JPanel implements MouseMotionListener,
    MouseListener { /** 矩形的起点 左上角* */
    private Point rectStart = null; /** 矩形的终点 右下角* */
    private Point rectStop = null; /** 是否绘制虚线矩形* */
    private boolean dottedTag = true; public DragDao() {
    this.setBackground(Color.WHITE);
    this.setSize(1000, 1000);
    rectStart = new Point(0, 0);
    rectStop = new Point(0, 0);
    this.addMouseListener(this);
    this.addMouseMotionListener(this);
    } @Override
    protected void paintComponent(Graphics g) {
    // TODO Auto-generated method stub
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    /** 矩形的宽度* */
    int w = Math.abs(rectStop.x - rectStart.x);
    /** 矩形的高度* */
    int h = Math.abs(rectStop.y - rectStart.y); /** 起点终点的最小值作为起点* */
    Point min = new Point(0, 0);
    min.x = Math.min(rectStop.x, rectStart.x);
    min.y = Math.min(rectStop.y, rectStart.y);
    /** 起点终点的最小值作为终点* */
    Point max = new Point(0, 0);
    max.x = Math.max(rectStop.x, rectStart.x);
    max.y = Math.max(rectStop.y, rectStart.y); /** 如果是绘制虚线矩形* */
    if (dottedTag) {
    /** new float[] { 5, 5, } 数组可以改变虚线的密度* */
    Stroke dash = new BasicStroke(0.5f, BasicStroke.CAP_BUTT,
    BasicStroke.JOIN_ROUND, 0.5f, new float[] { 5, 5, }, 0f);
    g2.setStroke(dash);
    g2.setColor(Color.BLUE);
    g2.drawRect(min.x, min.y, w, h);
    } else {
    g2.setStroke(new BasicStroke());
    g2.setColor(new Color(198, 214, 239));
    g.fillRect(min.x, min.y, w, h);
    } } /** *鼠标拖动 */
    public void mouseDragged(MouseEvent arg0) {
    // TODO Auto-generated method stub
    /** 随着鼠标的拖动 改变终点* */
    rectStop = arg0.getPoint();
    this.repaint();
    } public void mouseMoved(MouseEvent arg0) {
    // TODO Auto-generated method stub } /** 鼠标按键在组件上单击(按下并释放)时调用* */
    public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub } /** 鼠标按键在组件上按下时调用 */
    public void mousePressed(MouseEvent arg0) {
    /** 设置可以进行绘制* */
    dottedTag = true;
    /** 记录起始点* */
    rectStart = arg0.getPoint();
    /** 记录起终点* */
    rectStop = rectStart; } /** 鼠标按钮在组件上释放时调用* */
    public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub
    dottedTag = false;
    this.repaint();
    } /** 鼠标进入到组件上时调用* */
    public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub } /** 鼠标离开组件时调用* */
    public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub }}测试类import java.awt.BorderLayout;
    import java.awt.Dimension;import javax.swing.JFrame;public class DragDemo extends JFrame{
    public DragDao drag = new DragDao();
    public DragDemo() {
    super();
    drag = new DragDao();
    this.add(drag,BorderLayout.CENTER);
    Initialization("XuXian JuXing");
    }

      private void Initialization(String title) {
      Dimension   screen   =   getToolkit().getScreenSize();   
      this.setSize(screen.width*4/5,screen.height*4/5);
    this.setTitle(title);
    this.setLocationRelativeTo(null);
    this.setResizable(false);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    public static void main(String[] args) {
    new DragDemo();
    }
    }
      

  5.   

    Quote: 引用 5 楼 abc41106 的回复:

    我也没有好办法。
    想到一个:把所有画过的区域都存起来,每次重画都把它们都画一遍
    有那么点我想要的效果了,我还不知道怎么整合到我的里面呢,求指教
    下面是我写的:import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FileDialog;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.Toolkit;
    import java.awt.datatransfer.Clipboard;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.AffineTransformOp;
    import java.awt.image.BufferedImage;
    import java.awt.image.ColorModel;
    import java.awt.image.DirectColorModel;
    import java.awt.image.FilteredImageSource;
    import java.awt.image.ImageProducer;
    import java.awt.image.RGBImageFilter;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.filechooser.FileFilter;class ImageTransferFrame extends JFrame implements ActionListener {
    public BufferedImage bimg = null;
    private static Object source = null; private static Clipboard localClipboard = new Clipboard("local");
    private Image theImage;
    private JLabel label;
    private JMenuItem openItem;
    private JScrollPane pane;
    private JMenuItem exitItem;
    private JMenuItem copyItem;
    private JMenuItem pasteItem;
    private JButton save;
    private JButton zoomOut;
    private JButton zoomIn;
    private JButton rotateLeft;
    private JButton rotateRight;
    private JPanel editPane; public ImageTransferFrame() {
    setSize(800, 500);
    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    } });

    Container contentPane = getContentPane();
    this.label = new JLabel();
    this.label.addMouseListener(new listener(this));
    //this.label.addMouseMotionListener(new motionListener(this));
    this.label.addMouseMotionListener(new motionListener(new listener(this)));
    this.pane = new JScrollPane(this.label); contentPane.add(this.pane, "Center");
    contentPane.add(getEditorPanel(), "North");

    JMenu fileMenu = new JMenu("文件");
    this.openItem = new JMenuItem("打开图片");
    this.openItem.addActionListener(this);
    fileMenu.add(this.openItem); this.exitItem = new JMenuItem("退出");
    this.exitItem.addActionListener(this);
    fileMenu.add(this.exitItem);
    JMenuBar menuBar = new JMenuBar();
    menuBar.add(fileMenu);
    setJMenuBar(menuBar);
    } public JPanel getEditorPanel() {
    this.editPane = new JPanel();
    this.zoomOut = new JButton("放大");
    zoomOut.addActionListener(this);
    zoomOut.setName("放大");
    this.zoomIn = new JButton("缩小");
    zoomIn.addActionListener(this);
    zoomIn.setName("缩小");
    this.rotateLeft = new JButton("右旋转90度");
    rotateLeft.addActionListener(this);
    rotateLeft.setName("右旋转90度");
    this.rotateRight = new JButton("左旋转90度");
    rotateRight.addActionListener(this);
    rotateRight.setName("左旋转90度");
    this.save = new JButton("保存");
    save.addActionListener(this);
    editPane.setLayout(new FlowLayout(0));
    editPane.add(save);
    editPane.add(zoomOut);
    editPane.add(zoomIn);
    editPane.add(rotateLeft);
    editPane.add(rotateRight);
    return editPane;
    } public void actionPerformed(ActionEvent evt) {
    this.source = evt.getSource();
    if (source == this.openItem) {
    JFileChooser chooser = new JFileChooser();
    chooser.setCurrentDirectory(new File(".")); chooser.setFileFilter(new FileFilter() {
    public boolean accept(File f) {
    String name = f.getName().toLowerCase();
    return ((name.endsWith(".gif")) || (name.endsWith(".jpg"))
    || (name.endsWith(".jpeg")) || (f.isDirectory()));
    }
    public String getDescription() {
    return "Image files";
    }
    });
    int r = chooser.showOpenDialog(this);
    if (r == 0) {
    String name = chooser.getSelectedFile().getAbsolutePath();
    File file = new File(name);
    try {
    BufferedImage im = ImageIO.read(file);
    setImage(im);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }  

    else if(source==this.save)
    {
     save();
    }
    else if (source == this.zoomOut) 
    {// 放大
    this.theImage=this.theImage.getScaledInstance((int) (this.bimg.getWidth(this) * 1.2),(int) (this.bimg.getHeight(this) * 1.2), Image.SCALE_SMOOTH);
    this.bimg = new BufferedImage(this.theImage.getWidth(this),this.theImage.getHeight(this), 1);
    this.bimg.getGraphics().drawImage(this.theImage, 0, 0, this);
    setImage(this.bimg);

    else if (source == this.zoomIn) 
    {// 缩小
    this.theImage=this.theImage.getScaledInstance((int) (this.bimg.getWidth(this) * 0.8),
    (int) (this.bimg.getHeight(this) *0.8), Image.SCALE_SMOOTH);
    this.bimg = new BufferedImage(this.theImage.getWidth(this),this.theImage.getHeight(this), 1);
    this.bimg.getGraphics().drawImage(this.theImage, 0, 0, this);
    setImage(this.bimg);

    else if (source == this.rotateLeft) 
    {// 左旋转90度
    bimg = rotateImg(bimg,90,Color.WHITE);
    setImage(this.bimg);
    }
    else if (source == this.rotateRight) 
    {// 右旋转90度
    bimg = rotateImg(bimg,-90,Color.WHITE);
    setImage(this.bimg);

    } private void save() {
    FileDialog fileDialog = new FileDialog( new Frame() , "请指定一个文件名", FileDialog.SAVE );
    fileDialog.show();
    if(fileDialog.getFile()==null)
    {
    return;
    }
    else{
    // 目标文件
            try {
                BufferedImage inputbig = new BufferedImage(256, 256, BufferedImage.TYPE_INT_BGR);
                Graphics2D g = (Graphics2D) inputbig.getGraphics();
                g.drawImage(this.bimg, 0, 0,256,256,null); //画图
                g.dispose();
                inputbig.flush();
     
                ImageIO.write(inputbig, "jpg", new File(fileDialog.getDirectory() + fileDialog.getFile() + ".jpg")); //将其保存在C:/imageSort/targetPIC/下
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    }
    } public void render()
    {
    setImage(this.bimg);
    }
      public void resize(){//改變大小
    bimg = new BufferedImage(this.bimg.getWidth(this), this.bimg.getHeight(this),BufferedImage.TYPE_3BYTE_BGR);
    JLabel jlbImg = new JLabel(new ImageIcon(bimg));//在JLabel上放置bufImg,用來繪圖
    this.removeAll();
    this.add(jlbImg);
    jlbImg.setBounds(new Rectangle(0, 0, this.bimg.getWidth(this), this.bimg.getHeight(this)));

    //畫出原本圖形//
    Graphics2D g2d_bufImg = (Graphics2D) bimg.getGraphics();
    g2d_bufImg.setPaint(Color.white);
    g2d_bufImg.fill(new Rectangle2D.Double(0,0,this.bimg.getWidth(this), this.bimg.getHeight(this)));
    g2d_bufImg.drawImage(bimg,0,0,this);
    }

    public static BufferedImage rotateImg( BufferedImage image, int degree, Color bgcolor )
    {
       int iw = image.getWidth();//原始图象的宽度 
       int ih = image.getHeight();//原始图象的高度  
       int w=0;
       int h=0; 
       int x=0; 
       int y=0; 
       degree=degree%360;
       if(degree<0)
       degree=360+degree;//将角度转换到0-360度之间
      double ang=degree* 0.0174532925;//将角度转为弧度
      if(degree == 180|| degree == 0 || degree == 360)
       {
        w = iw; 
        h = ih; 
       }
       else if(degree == 90|| degree == 270)
       { 
        w = ih; 
        h = iw;  
       }
       else
       {  
        int d=iw+ih;  
        w=(int)(d*Math.abs(Math.cos(ang)));
        h=(int)(d*Math.abs(Math.sin(ang)));
       }
      
       x = (w/2)-(iw/2);//确定原点坐标
       y = (h/2)-(ih/2); 
      
       BufferedImage rotatedImage=new BufferedImage(w,h,image.getType()); 
       Graphics gs=rotatedImage.getGraphics();
       gs.setColor(bgcolor);
       gs.fillRect(0,0,w,h);//以给定颜色绘制旋转后图片的背景
      
       AffineTransform at=new AffineTransform();//二维变换类
       at.rotate(ang,w/2,h/2);//旋转图象
       at.translate(x,y); //连接此变换与平移变换。
       /*
       此类使用仿射转换来执行从源图像或 Raster 中 2D 坐标到目标图像或 Raster 中 
       2D 坐标的线性映射。所使用的插值类型由构造方法通过一个 RenderingHints 对象或通过此类中定义的整数插值类型之一来指定。
       */
       AffineTransformOp op=new AffineTransformOp(at,AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
       //转换源 BufferedImage 并将结果存储在目标 BufferedImage 中。
       op.filter(image, rotatedImage); 
       image=rotatedImage;
       return image;
     
    }
    public void setImage(BufferedImage image) {
    this.theImage = image;
    ImageProducer picSource = image.getSource();
    MyImage bwFilter = new MyImage();
    this.theImage = createImage(new FilteredImageSource(picSource, bwFilter));
    this.bimg = image;
    this.label.setIcon(new ImageIcon(this.theImage));
    } public static void main(String[] args)
      {
        JFrame frame1 = new ImageTransferFrame();     frame1.setTitle("Frame 1");     frame1.show();
      }

    }
      

  6.   

    Quote: 引用 5 楼 abc41106 的回复:

    我也没有好办法。
    想到一个:把所有画过的区域都存起来,每次重画都把它们都画一遍。
    还有些类:
    class listener extends MouseAdapter {
    ImageTransferFrame app = null;
    int orgx, orgy, endx, endy;
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); public listener(ImageTransferFrame a) {
    this.app = a;
    } public void mousePressed(MouseEvent e) {
            orgx = e.getX();
            orgy = e.getY();
        }

    public void mouseReleased(MouseEvent e) 
    {
    endx = e.getX();
    endy = e.getY();

    Graphics2D g = (Graphics2D) this.app.bimg.getGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(orgx, orgy-60, endx - orgx, endy - orgy+60); this.app.render();

    }

    }


    class motionListener implements MouseMotionListener {
    listener lis = null;
    int orgx, orgy, endx, endy; public motionListener(listener l) {
    this.lis = l;
    }
     
    public void mouseDragged(MouseEvent e) {
    orgx = lis.orgx;
    orgy = lis.orgy;
    endx=e.getX();
    endy=e.getY();

    Graphics2D g = (Graphics2D) lis.app.bimg.getGraphics();
    g.setColor(Color.WHITE);
     g.clearRect(orgx, orgy-60, endx - orgx, endy - orgy+60);
    //g.drawRect(orgx, orgy-60, endx - orgx, endy - orgy+60);
    g.fillRect(orgx, orgy-60, endx - orgx, endy - orgy+60);
         
           
            lis.app.render();
           
            lis.app.render();
    } public void mouseMoved(MouseEvent arg0) {
    }
    }


     class MyImage extends RGBImageFilter
     {
       int width = 0;
       int height = 0;
       int alpha = 0;
       int start = 0;
       int end = 0;    public MyImage() {
         this.canFilterIndexColorModel = true;
       }    public int filterRGB(int x, int y, int rgb)
       {
         DirectColorModel dcm = (DirectColorModel)ColorModel.getRGBdefault();      int red = dcm.getRed(rgb);
         int green = dcm.getGreen(rgb);
         int blue = dcm.getBlue(rgb);
         
         Color newColor = new Color(red, green, blue);
         return newColor.getRGB();
       }
     }
     
     
     class PointsSet
     {
       private ArrayList points;    public PointsSet()
       {
         this.points = new ArrayList();
       }    public PointsSet(int initCap) {
         this.points = new ArrayList(initCap);
       }    public void addPoint(int x, int y) {
         int size = this.points.size();
         if (size > 0) {
           Point point = (Point)this.points.get(size - 1);
           if ((point.x == x) && (point.y == y))
             return;
         }
         Point p = new Point();
         p.x = x;
         p.y = y;
         this.points.add(p);
       }    public int[][] getPoints() {
         int size = this.points.size();
         if (size == 0)
           return null;
         int[][] result = new int[2][size];
         for (int i = 0; i < size; ++i) {
           Point p = (Point)this.points.get(i);
           result[0][i] = p.x;
           result[1][i] = p.y;
         }
         return result;
       }    public int[][] getPoints(int x, int y) {
         int size = this.points.size();
         if (size == 0)
           return null;
         int[][] result = new int[2][size + 1];
         int i=0;
         for (; i < size; ++i) {
           Point p = (Point)this.points.get(i);
           result[0][i] = p.x;
           result[1][i] = p.y;
         }
         result[0][i] = x;
         result[1][i] = y;
         return result;
       }
     }
      

  7.   

    你的程序已经可以了,不需要整合我那个了。
    就是你有一个地方有问题:
    listener mouseListener = new listener(this);
    this.label.addMouseListener(mouseListener);
    // this.label.addMouseMotionListener(new motionListener(this));
    this.label.addMouseMotionListener(new motionListener(mouseListener));//按照你的代码,这里的mouseListener应该和上面那个一样,不能new一个新的
    另外,
    1.orgx, orgy - 60, endx - orgx, endy - orgy + 60
    这个-60 +60是什么意思?不明白。我去掉之后效果是对的
    2.如果鼠标从右上往左下画,你的程序会出问题,应该判断初始坐标和当前坐标哪个小
    3.如果拖拽很大再拖回去,draw的线框不能消失。这个我还没想到好办法。如果可以的话,建议在图片上面放一个透明的Label,然后功能都实现在这个Label上。
      

  8.   


    我整合了下你的例子到我的类中,但是我还是保存不了前一次的修改,图片打开的时候好像也要多点一下界面里面,求助,代码贴出来你看看;import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FileDialog;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.Shape;
    import java.awt.Stroke;
    import java.awt.Toolkit;
    import java.awt.datatransfer.Clipboard;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.AffineTransformOp;
    import java.awt.image.BufferedImage;
    import java.awt.image.ColorModel;
    import java.awt.image.DirectColorModel;
    import java.awt.image.FilteredImageSource;
    import java.awt.image.ImageProducer;
    import java.awt.image.RGBImageFilter;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSlider;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.swing.filechooser.FileFilter;class ImageTransferFrame2 extends JFrame implements ActionListener {
    public static BufferedImage bimg = null;

    private static Object source = null;
    public static Image theImage;
    private JLabel label;
    private JMenuItem openItem;
    private JScrollPane pane;
    private JMenuItem exitItem;
    private JButton zoomOut;
    private JButton zoomIn;
    private JButton rotateLeft;
    private JButton rotateRight;
    private JButton save;
    private JPanel editPane;
    public static List<Shape> list = new ArrayList<Shape>(); private JSlider sliderBrightness = null; public ImageTransferFrame2() {
    setSize(800, 500);
    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    Container contentPane = getContentPane();
    this.label = new RectLabel(new ImageIcon());
    this.pane = new JScrollPane(this.label);
    contentPane.add(this.pane, "Center");
    contentPane.add(getEditorPanel(), "North");
    JMenu fileMenu = new JMenu("File");
    this.openItem = new JMenuItem("Open");
    this.openItem.addActionListener(this);
    fileMenu.add(this.openItem);
    this.exitItem = new JMenuItem("Exit");
    this.exitItem.addActionListener(this);
    fileMenu.add(this.exitItem);
    JMenuBar menuBar = new JMenuBar();
    menuBar.add(fileMenu);
    setJMenuBar(menuBar);
    }
    public JPanel getEditorPanel() {
    this.editPane = new JPanel();
    this.zoomOut = new JButton("放大");
    zoomOut.addActionListener(this);
    zoomOut.setName("放大");
    this.zoomIn = new JButton("缩小");
    zoomIn.addActionListener(this);
    zoomIn.setName("缩小");
    this.rotateLeft = new JButton("右旋转90度");
    rotateLeft.addActionListener(this);
    rotateLeft.setName("右旋转90度");
    this.rotateRight = new JButton("左旋转90度");
    rotateRight.addActionListener(this);
    rotateRight.setName("左旋转90度");
    JLabel lBrightness = new JLabel("亮度调节");
    this.sliderBrightness = new JSlider(0);
    this.sliderBrightness.setValue(50);
    this.sliderBrightness.setPaintLabels(true);
    this.sliderBrightness.addChangeListener(new slider_changeListener());
    this.save = new JButton("保存");
    save.setName("保存");
    save.addActionListener(this);
    editPane.setLayout(new FlowLayout(0));
    editPane.add(save);
    editPane.add(zoomOut);
    editPane.add(zoomIn);
    editPane.add(rotateLeft);
    editPane.add(rotateRight);
    editPane.add(lBrightness);
    editPane.add(this.sliderBrightness);
    return editPane;
    } public void actionPerformed(ActionEvent evt) {
    this.source = evt.getSource();
    if (source == this.openItem) {
    JFileChooser chooser = new JFileChooser();
    chooser.setCurrentDirectory(new File(".")); chooser.setFileFilter(new FileFilter() {
    public boolean accept(File f) {
    String name = f.getName().toLowerCase();
    return ((name.endsWith(".gif")) || (name.endsWith(".jpg"))
    || (name.endsWith(".jpeg")) || (f.isDirectory()));
    }
    public String getDescription() {
    return "Image files";
    }
    });
    int r = chooser.showOpenDialog(this);
    if (r == 0) {
    String name = chooser.getSelectedFile().getAbsolutePath();
    File file = new File(name);
    try {
    BufferedImage im = ImageIO.read(file);
    setImage(im);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    } else if (source == this.exitItem) {
    System.exit(0);
    }
    else if(source==this.save)
    {
     save();
    }
    else if (source == this.zoomOut) 
    {// 放大
    this.theImage=this.theImage.getScaledInstance((int) (this.bimg.getWidth(this) * 1.2),(int) (this.bimg.getHeight(this) * 1.2), Image.SCALE_SMOOTH);
    this.bimg = new BufferedImage(this.theImage.getWidth(this),this.theImage.getHeight(this), 1);
    this.bimg.getGraphics().drawImage(this.theImage, 0, 0, this);
    setImage(this.bimg);

    else if (source == this.zoomIn) 
    {// 缩小
    this.theImage=this.theImage.getScaledInstance((int) (this.bimg.getWidth(this) * 0.8),
    (int) (this.bimg.getHeight(this) *0.8), Image.SCALE_SMOOTH);
    this.bimg = new BufferedImage(this.theImage.getWidth(this),this.theImage.getHeight(this), 1);
    this.bimg.getGraphics().drawImage(this.theImage, 0, 0, this);
    setImage(this.bimg);

    else if (source == this.rotateLeft) 
    {// 左旋转90度
    bimg = rotateImg(bimg,90,Color.WHITE);
    setImage(this.bimg);
    }
    else if (source == this.rotateRight) 
    {// 右旋转90度
    bimg = rotateImg(bimg,-90,Color.WHITE);
    setImage(this.bimg);

    }
    private void save() {
    FileDialog fileDialog = new FileDialog( new Frame() , "请指定一个文件名", FileDialog.SAVE );
    fileDialog.show();
    if(fileDialog.getFile()==null)
    {
    return;
    }
    else{
    // 目标文件
            try {
                BufferedImage inputbig = new BufferedImage(256, 256, BufferedImage.TYPE_INT_BGR);
                Graphics2D g = (Graphics2D) inputbig.getGraphics();
                g.drawImage(this.bimg, 0, 0,256,256,null); //画图
                g.dispose();
                inputbig.flush();
     
                ImageIO.write(inputbig, "jpg", new File(fileDialog.getDirectory() + fileDialog.getFile() + ".jpg")); //将其保存在C:/imageSort/targetPIC/下
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    }
    }
    public void resize(){//改變大小
    bimg = new BufferedImage(this.bimg.getWidth(this), this.bimg.getHeight(this),BufferedImage.TYPE_3BYTE_BGR);
    JLabel jlbImg = new JLabel(new ImageIcon(bimg));//在JLabel上放置bufImg,用來繪圖
    this.removeAll();
    this.add(jlbImg);
    jlbImg.setBounds(new Rectangle(0, 0, this.bimg.getWidth(this), this.bimg.getHeight(this)));
    //畫出原本圖形//
    Graphics2D g2d_bufImg = (Graphics2D) bimg.getGraphics();
    g2d_bufImg.setPaint(Color.white);
    g2d_bufImg.fill(new Rectangle2D.Double(0,0,this.bimg.getWidth(this), this.bimg.getHeight(this)));
    g2d_bufImg.drawImage(bimg,0,0,this);
    }

    public static BufferedImage rotateImg( BufferedImage image, int degree, Color bgcolor )
    {
       int iw = image.getWidth();//原始图象的宽度 
       int ih = image.getHeight();//原始图象的高度  
       int w=0;
       int h=0; 
       int x=0; 
       int y=0; 
       degree=degree%360;
       if(degree<0)
       degree=360+degree;//将角度转换到0-360度之间
      double ang=degree* 0.0174532925;//将角度转为弧度
      if(degree == 180|| degree == 0 || degree == 360)
       {
        w = iw; 
        h = ih; 
       }
       else if(degree == 90|| degree == 270)
       { 
        w = ih; 
        h = iw;  
       }
       else
       {  
        int d=iw+ih;  
        w=(int)(d*Math.abs(Math.cos(ang)));
        h=(int)(d*Math.abs(Math.sin(ang)));
       }
       x = (w/2)-(iw/2);//确定原点坐标
       y = (h/2)-(ih/2); 
       BufferedImage rotatedImage=new BufferedImage(w,h,image.getType()); 
       Graphics gs=rotatedImage.getGraphics();
       gs.setColor(bgcolor);
       gs.fillRect(0,0,w,h);//以给定颜色绘制旋转后图片的背景
       AffineTransform at=new AffineTransform();//二维变换类
       at.rotate(ang,w/2,h/2);//旋转图象
       at.translate(x,y); //连接此变换与平移变换。
       /*
       此类使用仿射转换来执行从源图像或 Raster 中 2D 坐标到目标图像或 Raster 中 
       2D 坐标的线性映射。所使用的插值类型由构造方法通过一个 RenderingHints 对象或通过此类中定义的整数插值类型之一来指定。
       */
       AffineTransformOp op=new AffineTransformOp(at,AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
       //转换源 BufferedImage 并将结果存储在目标 BufferedImage 中。
       op.filter(image, rotatedImage); 
       image=rotatedImage;
       return image;
    }
    public void setImage(BufferedImage image) {
    this.theImage = image;
    ImageProducer picSource = image.getSource();
    MyImage bwFilter = new MyImage();
    this.theImage = createImage(new FilteredImageSource(picSource, bwFilter));
    this.bimg = image;
    this.theImage.flush();
    //this.label.setIcon(new ImageIcon(this.theImage));
    this.label = new RectLabel(new ImageIcon(this.theImage));
    }
     public static void main(String[] args)
      {
        JFrame frame1 = new ImageTransferFrame2();
        frame1.setLocationRelativeTo(null);//
        frame1.setTitle("Frame 1");
        frame1.show();
      }
    }
      

  9.   

    还有些类:
    class slider_changeListener implements ChangeListener {
    public void stateChanged(ChangeEvent arg0) {
    JSlider slider = (JSlider) arg0.getSource();
    }
    }
     class MyImage extends RGBImageFilter
     {
       int width = 0;
       int height = 0;
       int alpha = 0;
       int start = 0;
       int end = 0;    public MyImage() {
         this.canFilterIndexColorModel = true;
       }    public int filterRGB(int x, int y, int rgb)
       {
         DirectColorModel dcm = (DirectColorModel)ColorModel.getRGBdefault();      int red = dcm.getRed(rgb);
         int green = dcm.getGreen(rgb);
         int blue = dcm.getBlue(rgb);
         
         Color newColor = new Color(red, green, blue);
         return newColor.getRGB();
       }
     }
     class PointsSet
     {
       private ArrayList points;    public PointsSet()
       {
         this.points = new ArrayList();
       }    public PointsSet(int initCap) {
         this.points = new ArrayList(initCap);
       }    public void addPoint(int x, int y) {
         int size = this.points.size();
         if (size > 0) {
           Point point = (Point)this.points.get(size - 1);
           if ((point.x == x) && (point.y == y))
             return;
         }
         Point p = new Point();
         p.x = x;
         p.y = y;
         this.points.add(p);
       }    public int[][] getPoints() {
         int size = this.points.size();
         if (size == 0)
           return null;
         int[][] result = new int[2][size];
         for (int i = 0; i < size; ++i) {
           Point p = (Point)this.points.get(i);
           result[0][i] = p.x;
           result[1][i] = p.y;
         }
         return result;
       }    public int[][] getPoints(int x, int y) {
         int size = this.points.size();
         if (size == 0)
           return null;
         int[][] result = new int[2][size + 1];
         int i=0;
         for (; i < size; ++i) {
           Point p = (Point)this.points.get(i);
           result[0][i] = p.x;
           result[1][i] = p.y;
         }
         result[0][i] = x;
         result[1][i] = y;
         return result;
       }
     }import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Shape;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.geom.Rectangle2D;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.ImageIcon;
    import javax.swing.JLabel;public class RectLabel extends JLabel { private int x1 = 0;
    private int y1 = 0;
    private int x2 = 0;
    private int y2 = 0;
    private boolean current = true;
    private static List<Shape> shapelist = new ArrayList<Shape>();
    public static ImageIcon icon = null; public RectLabel() {
    } public RectLabel(ImageIcon image) {
    this.icon = image;
    this.setIcon(icon);

    repaint();
    addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent event) {
    Point p = event.getPoint();
    x1 = (int) p.getX();
    y1 = (int) p.getY();
    } public void mouseReleased(MouseEvent event) {
    Point p = event.getPoint();
    x2 = (int) p.getX();
    y2 = (int) p.getY();
    shapelist.add(new Rectangle2D.Double(Math.min(x1, x2), Math.min(y1,
    y2), Math.abs(x1 - x2), Math.abs(y1 - y2)));
    current = true;
    repaint();
    }
    });
    addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent event) {
    Point p = event.getPoint();
    x2 = (int) p.getX();
    y2 = (int) p.getY();
    current = false;
    repaint();
    }
    });
    }
    protected void paintComponent(Graphics g) {
    if (!current)
    return;
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.WHITE);
    for (Shape s : shapelist) {
    if(this.icon!=null)
    {
    g2.drawImage(this.icon.getImage(), 0, 0, 800, 560, this);
    }
    g2.fill(s);
    repaint();
    }
    } protected void paintBorder(Graphics g) {
    if (current)
    return;
    Graphics2D g2 = (Graphics2D) g;
    g.setColor(getForeground());
    if(this.icon!=null)
    {
    g2.drawImage(this.icon.getImage(), 0, 0, 800, 560, this);
    }
    g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math
    .abs(y1 - y2));
    repaint();
    }
     
    }
      

  10.   

    参照上面保存每次都记录的思想,做一点小改动就可以了,在鼠标释放之后保存记录
    代码如下package xuxian;import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Shape;
    import java.awt.Stroke;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.Rectangle2D;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JPanel;public class DragDao extends JPanel implements MouseMotionListener,
    MouseListener { /** 矩形的起点 左上角* */
    private static Point rectStart = null; /** 矩形的终点 右下角* */
    private static Point rectStop = null; /** 是否绘制虚线矩形* */
    private boolean dottedTag = true;

    /*************这里更改了****************/
    private List<Shape> list = new ArrayList<Shape>();  public DragDao() {
    this.setBackground(Color.WHITE);
    this.setSize(1000, 1000);
    rectStart = new Point(0, 0);
    rectStop = new Point(0, 0);
    this.addMouseListener(this);
    this.addMouseMotionListener(this);
    // this.isClear = isClear;
    } @Override
    protected void paintComponent(Graphics g) {
    // TODO Auto-generated method stub
    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D) g;
    /** 矩形的宽度* */
    int w = Math.abs(rectStop.x - rectStart.x);
    /** 矩形的高度* */
    int h = Math.abs(rectStop.y - rectStart.y); /** 起点终点的最小值作为起点* */
    Point min = new Point(0, 0);
    min.x = Math.min(rectStop.x, rectStart.x);
    min.y = Math.min(rectStop.y, rectStart.y);
    /** 起点终点的最小值作为终点* */
    Point max = new Point(0, 0);
    max.x = Math.max(rectStop.x, rectStart.x);
    max.y = Math.max(rectStop.y, rectStart.y); /** 如果是绘制虚线矩形* */
    if ( dottedTag) {
    /** new float[] { 5, 5, } 数组可以改变虚线的密度* */
    Stroke dash = new BasicStroke(0.5f, BasicStroke.CAP_BUTT,
    BasicStroke.JOIN_ROUND, 0.5f, new float[] { 5, 5, }, 0f);
    g2.setStroke(dash);
    g2.setColor(Color.BLUE);
    g2.drawRect(min.x, min.y, w, h);
    } else {
    list.add(new Rectangle2D.Double(min.x, min.y, w, h)); 
    }
    /*************这里更改了****************/
    g2.setStroke(new BasicStroke());
    g2.setColor(new Color(198, 214, 239));
    for(Shape s:list){
    g2.fill(s);
    } } /** *鼠标拖动 */
    public void mouseDragged(MouseEvent arg0) {
    // TODO Auto-generated method stub
    /** 随着鼠标的拖动 改变终点* */
    rectStop = arg0.getPoint();
    this.repaint();
    } public void mouseMoved(MouseEvent arg0) {
    // TODO Auto-generated method stub } /** 鼠标按键在组件上单击(按下并释放)时调用* */
    public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub } /** 鼠标按键在组件上按下时调用 */
    public void mousePressed(MouseEvent arg0) {
    /** 设置可以进行绘制* */
    dottedTag = true;
    /** 记录起始点* */
    rectStart = arg0.getPoint();
    /** 记录起终点* */
    rectStop = rectStart; } /** 鼠标按钮在组件上释放时调用* */
    public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub
    dottedTag = false;
    this.repaint();
    } /** 鼠标进入到组件上时调用* */
    public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub } /** 鼠标离开组件时调用* */
    public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub }}
      

  11.   

    你要是整合我那个代码的话,那你的代码改动可就大了。。放大、缩小、保存,都要改。还不如重写一个了
    我只能把我的这部分给你改好。剩下的,只能你自己改了
    class RectLabel extends JLabel { private int x1 = 0;
    private int y1 = 0;
    private int x2 = 0;
    private int y2 = 0;
    private boolean current = true;
    private static List<Shape> shapelist = new ArrayList<Shape>();
    public static ImageIcon icon = null; public RectLabel() {
    } public RectLabel(ImageIcon image) {
    this.icon = image;
    this.setIcon(icon); //repaint();
    addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent event) {
    Point p = event.getPoint();
    x1 = (int) p.getX();
    y1 = (int) p.getY();
    } public void mouseReleased(MouseEvent event) {
    Point p = event.getPoint();
    x2 = (int) p.getX();
    y2 = (int) p.getY();
    shapelist.add(new Rectangle2D.Double(Math.min(x1, x2), Math
    .min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2)));
    current = true;
    repaint();
    }
    });
    addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent event) {
    Point p = event.getPoint();
    x2 = (int) p.getX();
    y2 = (int) p.getY();
    current = false;
    repaint();
    }
    });
    } protected void paintComponent(Graphics g) {
    if (!current)
    return;
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.WHITE);
    if (this.icon != null) {//这个要放到循环外面
    g2.drawImage(this.icon.getImage(), 0, 0, 800, 560, this);
    }
    for (Shape s : shapelist) { g2.fill(s);
    // repaint();
    }
    } protected void paintBorder(Graphics g) {
    if (current)
    return;
    Graphics2D g2 = (Graphics2D) g;
    g.setColor(getForeground());
    if (this.icon != null) {
    g2.drawImage(this.icon.getImage(), 0, 0, 800, 560, this);
    }
    for (Shape s : shapelist) {//这个循环按你的需求,想加就加,不加就去掉。
    g2.fill(s);
    }
    g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
    Math.abs(y1 - y2));
    // repaint();
    }}