当前位置:编程学习 > JAVA >>

[求助] 关于画板程序中画一个根据鼠标拖拽变化的动态矩形实现方法

如何让矩形随着鼠标移动而变化,同时把上一个矩形擦掉而不擦掉背景呢!
 求救 --------------------编程问答-------------------- 百度:java双缓冲
把背景重新画上去就行了 --------------------编程问答--------------------


import java.awt.BorderLayout;
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.JPanel;
import javax.swing.SwingUtilities;


/**
 *
 * @author raistlic
 * @date   Dec 20, 2012
 */
public class RecPanel extends JPanel {
  
  public static void main(String[] args) {
    
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        
        JFrame f = new JFrame("Rectangle Panel");
        f.getContentPane().add(new RecPanel(), BorderLayout.CENTER);
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setVisible(true);
      }
    });
  }
  
  private Point start;
  private Point end;
  RecPanel() {
    
    start = new Point(0, 0);
    end = new Point(0, 0);
    
    addMouseListener(new MouseAdapter() {
      
      @Override
      public void mousePressed(MouseEvent e) {

        int x = e.getX();
        int y = e.getY();

        start.x = x;
        start.y = y;
        end.x = x;
        end.y = y;
        repaint();
      }
    });
    
    addMouseMotionListener(new MouseMotionAdapter() {
      
      @Override
      public void mouseDragged(MouseEvent e) {

        end.x = e.getX();
        end.y = e.getY();
        repaint();
      }
    });
  }
  
  @Override
  protected void paintComponent(Graphics g) {
    
    super.paintComponent(g);
    
    if( !end.equals(start) ) {
      
      g.setColor(getForeground());
      
      int x = Math.min(start.x, end.x);
      int y = Math.min(start.y, end.y);
      int width = Math.max(start.x, end.x) - x;
      int height = Math.max(start.y, end.y) - y;
      
      g.drawRect(x, y, width, height);
    }
  }
}
--------------------编程问答-------------------- 双缓冲OK!
引用 1 楼 wapigzhu 的回复:
百度:java双缓冲
把背景重新画上去就行了

这个效果不是是不是?

package test;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;
public class Test extends JFrame{
int x0,y0,x1,y1;

Test(){
setSize(600, 400);

setVisible(true);
addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
x0=e.getX();
y0=e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
x1=e.getX();
y1=e.getY();
drawRec();
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}
});
}

void drawRec(){
repaint();
}

@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.setColor(new Color(222,0,0));
g.drawRect(x0, y0, x1-x0, y1-y0);
}

public static void main(String []args){
new Test();
}
}


--------------------编程问答-------------------- 如果是要保留已经画好的矩形,然后后来的矩形覆盖原来矩形的效果:




import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


/**
 *
 * @author raistlic
 * @date   Dec 20, 2012
 */
public class RecPanel extends JPanel {
  
  public static void main(String[] args) {
    
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        
        JFrame f = new JFrame("Rectangle Panel");
        f.getContentPane().add(new RecPanel(), BorderLayout.CENTER);
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setVisible(true);
      }
    });
  }
  
  private Point start;
  private Point end;
  private List<Rectangle> drawn;
  RecPanel() {
    
    start = new Point(0, 0);
    end = new Point(0, 0);
    drawn = new LinkedList<Rectangle>();
    
    addMouseListener(new MouseAdapter() {
      
      @Override
      public void mousePressed(MouseEvent e) {

        int x = e.getX();
        int y = e.getY();

        start.x = x;
        start.y = y;
        end.x = x;
        end.y = y;
        repaint();
      }
      
      @Override
      public void mouseReleased(MouseEvent e) {
        
        if( !end.equals(start) ) {
          
          drawn.add(getCurrentRect());
          
          Point curr = e.getPoint();
          start = new Point(curr);
          end = new Point(curr);
        }
      }
    });
    
    addMouseMotionListener(new MouseMotionAdapter() {
      
      @Override
      public void mouseDragged(MouseEvent e) {

        end.x = e.getX();
        end.y = e.getY();
        repaint();
      }
    });
  }
  
  @Override
  protected void paintComponent(Graphics g) {
    
    super.paintComponent(g);
    
    @SuppressWarnings("unchecked")
    Graphics2D gg = (Graphics2D)g.create();
    gg.setColor(getForeground());
    gg.setBackground(getBackground());
    for(Rectangle r : drawn) {
      
      gg.clearRect(r.x, r.y, r.width, r.height);
      gg.drawRect(r.x, r.y, r.width, r.height);
    }
    
    if( !end.equals(start) ) {
      
      Rectangle r = getCurrentRect();
      gg.clearRect(r.x, r.y, r.width, r.height);
      gg.drawRect(r.x, r.y, r.width, r.height);
    }
    gg.dispose();
  }
  
  private Rectangle getCurrentRect() {
    
    int x = Math.min(start.x, end.x);
    int y = Math.min(start.y, end.y);
    int width = Math.max(start.x, end.x) - x;
    int height = Math.max(start.y, end.y) - y;
    
    return new Rectangle(x, y, width, height);
  }
}
--------------------编程问答--------------------
引用 4 楼 raistlic 的回复:
如果是要保留已经画好的矩形,然后后来的矩形覆盖原来矩形的效果:


Java code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747……

谢谢
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,