我正在创建一个程序,您可以在其中绘制(线条,椭圆或矩形)并指定颜色,宽度,填充等。我有一个JPanel类,它实现了MouseMotionListener和MouseListener。
这是mouseDragged方法的代码:
@Override
public void mouseDragged(MouseEvent e) {
pointEnd = e.getPoint();
repaint();
}
这是mousePressed方法的代码:
public void mousePressed(MouseEvent e) {
Paint c = window.getFirst();
second = window.getSecond();
int shapeOption= window.getShapeSelect();
//System.out.println(shapeOption);
boolean fill = window.getFilled();
BasicStroke s = new BasicStroke(window.getLineWidth()); //may not need new BasicStroke()
pointStart = e.getPoint();
Shape temp;
switch (shapeOption) {
case 0:
temp = new Line(pointStart, pointEnd, s, c);
case 1:
temp = new Rectangles(pointStart, pointEnd, s, c, fill);
default:
temp = new Oval(pointStart, pointEnd,s,c, fill);
}
shapes.add(temp);
}
这个程序有两个问题。 switch语句无法按预期工作。即使shapeOption正确更新,它也只使用默认情况。我收到新Line和新Rectangle的警告“永远不会使用赋值”。
我遇到的另一个问题是该计划只吸引了一点。我相信这是因为它在按下鼠标时会创建形状,此时pointEnd与pointStart相同。我如何才能使它直到mouseDragged方法完成后才传递pointEnd?
我希望这是有道理的,任何帮助都表示赞赏。
答案 0 :(得分:0)
提出两个问题:
1)每个案例陈述的末尾都需要break;
;否则,控制权将通过您的所有案例陈述,temp
将始终设置为Oval
。
2)在mousePressed()
之前调用mouseDragged()
。您应该在mouseDragged()
中进行绘制以使其生效,或者mouseReleased()
仅在形状完成时执行绘制。您可能还需要一个标记来检查鼠标是否在mousePressed()
和mouseReleased()
之间移动了足够远,这样您就不会在非拖动的点击事件上绘制点。