类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;
}
}
您的点数需要存储在数组或列表中。因此,您所做的就是使用MouseListener
和MouseMotionListener
(为此使用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画布没有提供绘制带有圆角的矩形的方法。 如何使用和方法? 您也可以使用方法代替方法。