我正在尝试设置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();
}
答案 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);
我希望这会有所帮助。