在mouseDragged中设置终点并在mousePressed中使用它

时间:2015-10-30 02:40:48

标签: java swing

我正在创建一个程序,您可以在其中绘制(线条,椭圆或矩形)并指定颜色,宽度,填充等。我有一个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?

我希望这是有道理的,任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:0)

提出两个问题:

1)每个案例陈述的末尾都需要break;;否则,控制权将通过您的所有案例陈述,temp将始终设置为Oval

2)在mousePressed()之前调用mouseDragged()。您应该在mouseDragged()中进行绘制以使其生效,或者mouseReleased()仅在形状完成时执行绘制。您可能还需要一个标记来检查鼠标是否在mousePressed()mouseReleased()之间移动了足够远,这样您就不会在非拖动的点击事件上绘制点。