如何使用Point类设置点的位置?

时间:2016-10-24 14:14:25

标签: java swing point

我正在尝试设置JFrame窗口中显示的几何图形的位置。例如,如果它是一个矩形,那么我需要将它的左上点向右移动10个像素,向下移动10个像素。

我试图这样做,但它没有工作:

public void relocate(ArrayList<MyShape> newShape){

    int x1, x2, y1 , y2;

    for(int i = 0; i < newShape.size(); i++){

        x1 = (int)newShape.get(i).p1.getX();
        y1 = (int)newShape.get(i).p1.getY();

        x2 = (int)newShape.get(i).p2.getX();
        y2 = (int)newShape.get(i).p2.getY();


        newShape.get(i).setLocation(x1 + 10, y1);
        newShape.get(i).setP1(newShape.get(i).getP1());
        newShape.get(i).setLocation(x2, y2 + 10);
        newShape.get(i).setP2(newShape.get(i).getP2());


        if(newShape.get(i).getCol() != null){
            newShape.get(i).setCol(Color.BLUE);
        }


    }

    repaint();
}

3 个答案:

答案 0 :(得分:1)

您的代码应该可以工作 - 从某种意义上说它会改变屏幕上对象的位置。那么,这里发生了什么?您的解决方案有什么问题?

我可以给你一些提示:

您可以检查代码的其他任何部分是否正在弄乱位置设置。它们可能会覆盖您的设置。

也许这段代码在AWT线程之外运行。您可以使用SwingUtilities.isEventDispatchThread()进行检查。

您可以在Swing中重复使用Point - s。点是可变对象。这导致代码不那么干净,但在这种情况下性能很重要:

MyShape shape = newShape.get(i);
Point p = shape.getP1();
p.setLocation(p.x, p.y + 10);

也许revalidate()来电也可以提供帮助:

public void relocate(ArrayList<MyShape> newShape) {
    // some code changing locations
    revalidate(); // this is it
    repatint();
}

答案 1 :(得分:1)

以下分析基于MyShape如何运作的假设,因为您在被要求时拒绝提供这些详细信息。

看看你的算法。对于每个形状:

1)您正在捕获P1和P2的原始值。到目前为止一切都很好。

2)您正在使用P1的调整值调用形状的setLocation()方法。 现在,setLocation()做了什么?理解这是为什么你被问到MyShape类的一部分,并说它是所有形状的超类都无济于事。

3)您告诉形状将其P1设置为通过查询其P1获得的任何值。如果吸气者和制定者做任何合理的事情,这将无能为力。

4)然后再次呼叫setLocation(),这次使用P2的调整值。 再次,这是做什么的?它可能会撤消你在第2步中完成的任何事情。

5)通过查询P2,告诉形状将其P2设置为任何值。同样,这可能没有做任何事情。

我想,您想要做的是根据您在步骤2中计算出的调整值设置P1;并根据步骤4中的调整值设置P2。但这不是你的代码所说的,除非secLocation,getP1和getP2都在做非常不正常的事情。

答案 2 :(得分:1)

不确定MyShape的作用,但newShape.get(i).setP1似乎只是覆盖了newShape.get(i).setLocation。尝试像这样调整代码:

//Change this
newShape.get(i).setLocation(x1 + 10, y1);
newShape.get(i).setP1(newShape.get(i).getP1());
newShape.get(i).setLocation(x2, y2 + 10);
newShape.get(i).setP2(newShape.get(i).getP2());
//To this
newShape.get(i).getP1().setLocation(x1 + 10, y1);
newShape.get(i).getP2().setLocation(x2, y2 + 10);

我希望这会有所帮助。