当前位置: 首页 > 知识库问答 >
问题:

如何在第二次单击后在画布上绘制形状

严恩
2023-03-14

类Canvas扩展java.awt.Canvas实现MouseListener,MouseMotionListener{//Constants for shapes public static final int CIRCLE=1;public static final int RECTANGLE=2;

// Coordinates of points to draw
private int x1, y1, x2, y2;

// shape to draw
private int shape = CIRCLE;
private final int PAINT = 0; // do we need to draw current component
private final int NOPAINT = 1; // we dont need to draw current componet
private int paintOrRepaint = NOPAINT;// at the beginning we dont need to draw

public void setShape(int shape) {
    this.shape = shape;
}

// filled color
private Color filledColor = null;


public void setFilledColor(Color color) {
    filledColor = color;
}


public Canvas() {
    addMouseListener(this);
    addMouseMotionListener(this);
} // end of constructor


@Override
public void paint(Graphics g) {
    // the drawing area
    int x, y, width, height;

    // determine the upper-left corner of bounding rectangle
    x = Math.min(x1, x2);
    y = Math.min(y1, y2);

    // determine the width and height of bounding rectangle
    width = Math.abs(x1 - x2);
    height = Math.abs(y1 - y2);

    // current shape(cur_shape) : by default it is a line after using a switch we update this to
    // circle of rectangle
    Shape cur_shape = new Line2D.Double(x1, y1, x2, y2);
    switch (shape) {
        case RECTANGLE :
            cur_shape = new Rectangle2D.Double(x, y, width, height);
            break;
        case CIRCLE :
            int diameter = Math.max(width, height);
            cur_shape = new Ellipse2D.Double(x,y, diameter, diameter);
            break;
    }


    if(paintOrRepaint == PAINT){
        Figure sh;
        if(shape == RECTANGLE) {
            sh = new Rectangle(cur_shape,filledColor, shape);
            GUI.shapes.add(sh);
        }
        else if(shape == CIRCLE) {
            sh = new Circle(cur_shape,filledColor, shape);
            GUI.shapes.add(sh);
        }
    }

    Graphics2D graphics = (Graphics2D) g;
    for (Figure s : GUI.shapes) {

        if(s.fill != null)
            g.setColor(s.fill);
        else
            g.setColor(Color.BLACK);
        if(s.fill != null)
            graphics.fill(s.shape);
        else
            graphics.draw(s.shape);
    }
    GUI.updateShapes();
    setPaintOrRepaint(NOPAINT);


    GUI.selectColor = false;
    GUI.selectShape = false;
}


@Override
public void mousePressed(MouseEvent event) {
    x1 = event.getX();
    y1 = event.getY();

}

@Override
public void mouseReleased(MouseEvent event) {
    x2 = event.getX();
    y2 = event.getY();

    setPaintOrRepaint(PAINT);
    repaint();

}

@Override
public void mouseClicked(MouseEvent evt) { }
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}

@Override
public void mouseDragged(MouseEvent event) {
    x2 = event.getX();
    y2 = event.getY();
}

@Override
public void mouseMoved(MouseEvent e) {}

private void setPaintOrRepaint(int option) {
    paintOrRepaint = option;
}

}

共有1个答案

滑景胜
2023-03-14

您的点数需要存储在数组或列表中。因此,您所做的就是使用MouseListenerMouseMotionListener(为此使用MouseAdapter)。

对于第一个点和其他点,请在mouseclicked()中设置它。当您单击鼠标时,将点存储在您选择的数据结构中。

如果你拖动鼠标,你会得到一个点流,所以我不知道这会有多有用(除非你想画线并保存坐标)。

并不是说如果使用内部类并扩展mouseadapter,就可以摆脱独立实现侦听器的混乱。由于MouseAdapter使用空方法实现了这两个侦听器,您只需重写所需的侦听器,然后使用自己的MouseListener实例。

class MyMouseListener extends MouseAdapter {
   // your overriden methods go here.
   // you only need to override the ones you need.
}

然后

MyMouseListener ml = new MyMouseListener();
addMouseListener(ml);
addMouseMotionListener(ml);

我不确定您是如何绘制的,但通常是在JPanel上完成的,该JFrame包含了该JPanel。在JPanel中,您将重写PaintComponent(g)如下所示。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
   // your stuff here
}
 类似资料:
  • 我正在尝试创建一个程序,该程序应该基于两次鼠标左键单击在画布上绘制一个矩形,并通过一次右键单击清除画布。 创建矩形的方式应该是,第一次鼠标点击模拟矩形的一个角,下一次鼠标点击与第一次鼠标点击相比模拟矩形的对角线角。 我被困在如何存储第一次鼠标点击的坐标,然后把第二次鼠标点击用好,因为每个定义的矩形只基于一组坐标创建,这是矩形的左上角。 现在,我的代码所做的只是绘制固定大小的矩形(50x25),这显

  • 在HTML和JavaScript中,这应该是一个非常简单的任务。我有一个图标栏,目前有一个单一的可点击链接,新的框。在图标栏下面,我有一张画布。我的目标是在用户每次按下new Box按钮时,在画布上绘制一个新的矩形。 现在,我的图标栏和画布正确显示,我可以单击图标栏的“新建框”链接,但画布上没有出现矩形,尽管我已将其参数指定为:。 null null

  • 我编写了这段代码,可以在JavaFX画布上绘制。它可以很好地工作,但我不知道如何重新绘制画布(比如在Swing中),以便在新画布上重新开始绘制。这是我的代码,非常感谢你的帮助!马里奥

  • 问题内容: 我需要知道如何在画布上绘制多边形。不使用jQuery或类似的东西。 问题答案: 使用和创建一个路径:

  • 实际上,我可以使用函数来完成。我从“HTML5画布-如何在图像背景上画一条线?”中得到的东西。但是我需要在不使用from函数的情况下绘制图像,如下所示:

  • 问题内容: 我发现只能填充矩形,而没有圆角,该怎么办? 问题答案: HTML5画布没有提供绘制带有圆角的矩形的方法。 如何使用和方法? 您也可以使用方法代替方法。