在panel上,鼠标按下挪动,松开画一个矩形,矩形的位置是鼠标按下和松开的位置。意思就是动态的绘制一个矩形。
请各位高手指教一下

解决方案 »

  1.   

    用mouselistener,在mousePressed()中获取当前点的坐标并记录,在mouseReleased()中获取第二个坐标,然后画矩形
      

  2.   

    真正做的时候,没那么简单,需要考虑很多复杂问题,比如向右下拖曳与向左上拖曳的处理是有点不一样的。以前学Swing事件时写过一个小程序:
    可以画线、矩形、椭圆。
    可以调配各种颜色。
    绘制矩形或椭圆时按住Shift键,可以绘制正方形或圆。
    在画布上单击鼠标右键,将弹出快捷菜单,可以执行“撤消”等操作。可能对楼主有所帮助。楼主如有兴趣,可以下载来看看。呵呵。简易绘图 v1.0.1
      

  3.   

    [接2楼]
    这是其中的部分代码,为满足楼主的要求而做了简化,去掉了集合,只保留最后绘制的矩形:import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class Exercise2 {
    public static void main(String[] args) {
    DrawFrame frame = new DrawFrame();
    frame.setVisible(true);
    }
    }class DrawFrame extends JFrame {
    public DrawFrame() {
    setTitle("简易绘图 v1.0.1");
    setSize(640, 480);
    setExtendedState(Frame.MAXIMIZED_BOTH);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentpane = getContentPane();
    DrawPanel drawPanel = new DrawPanel();
    setLayout(new BorderLayout());
    contentpane.add(drawPanel, BorderLayout.CENTER);
    contentpane.add("South", new Label("提示:按住Shift键,可以绘制正方形"));
    }
    }class DrawPanel extends JPanel {
    Color currColor = Color.BLACK; // 绘制颜色
    boolean isDraw = false; // 是否开始绘制
    boolean isShift = false;
    int x1, y1, x2, y2;
    // 构造函数,初始化变量及布局组件
    DrawPanel() {
    setBackground(Color.white); // repaint();
    setBorder(BorderFactory.createLineBorder(Color.BLACK)); addMouseListener(new MouseAdapter() { // 监听鼠标事件
    public void mousePressed(MouseEvent event) { // 按左键时确定起始点坐标
    if (event.getButton() == event.BUTTON1) {
    x1 = event.getX();
    y1 = event.getY();
    if (!isDraw)
    isDraw = true;
    } else
    isDraw = false;
    } public void mouseReleased(MouseEvent event) { // 松开左键将绘画数据存入相应数组
    if (event.getButton() == event.BUTTON1) {
    x2 = event.getX();
    y2 = event.getY();
    int left, top, width, height;
    width = Math.abs(x1 - x2);
    height = Math.abs(y1 - y2);
    left = Math.min(x1, x2);
    isShift = event.isShiftDown();
    if (isShift)
    height = width;// 按下Shift键统一宽高
    // 确定顶坐标(因为高度可能因为画正方形或圆而被改变)
    top = (y2 < y1) ? y1 - height : y1;
    repaint();
    }
    }
    });
    addMouseMotionListener(new MouseMotionListener() {
    public void mouseMoved(MouseEvent event) { // 鼠标在绘图区保持十字形状
    requestFocus();
    setCursor(Cursor
    .getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    } public void mouseDragged(MouseEvent event) { // 鼠标拖动时绘制临时图画
    if (isDraw) {
    isShift = event.isShiftDown();
    x2 = event.getX();
    y2 = event.getY();
    repaint();
    }
    }
    });
    } public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // 以下计算临时图形数据并绘制
    if (isDraw) {
    g.setColor(currColor);
    int left, top, width, height;
    width = Math.abs(x1 - x2);
    height = Math.abs(y1 - y2);
    left = Math.min(x1, x2);
    if (isShift)
    height = width;// 按下Shift键统一宽高
    //确定顶坐标(因为高度可能因为画正方形或圆而被改变)
    top = (y2 < y1) ? y1 - height : y1;
    g.drawRect(left, top, width, height);
    }
    }
    }运行效果如下:
      

  4.   

    用java.awt.gemo.Rectangle2D类.
    直接根据两点构造矩形就行了.让后用Graphics2D.draw(Shape);
    前提是在mousePressed和mouseReleased中获取两点。
      

  5.   

    up 学习中。GUI 我学了很久了,没有学会多少!!
      

  6.   

    在鼠标事件监听中mouseReleased()和mouseDragged()、mouseMoved()不能放一起,是不是啊!高手!
      

  7.   


    鉴于鼠标事件的复杂性,Swing中提供了两个不同的接口用于负责鼠标事件的处理。
    MouseListener负责处理五个:按下、释放、单击、进入或离开
    MouseMotionListener负责处理两个:移动、拖动mouseReleased()属于MouseListener
    mouseDragged()、mouseMoved()属于MouseMotionListener
    这三个方法是分别定义在两个不同的接口中,但是也是可以放在一起的。你写一个类,同时实现这两个接口,它们就在一起啦。呵呵。
    形如:
    public class MyMouseHandler extends MouseAdapter implements MouseMotionListener //MouseAdapter是MouseListener的一个实现类
    {
      public void mouseReleased(MouseEvent e){  }
      public void mouseMoved(MouseEvent e){  }
      public void mouseDragged(MouseEvent e){  }
    }