我正在开展一个项目,我必须首先在框架上随机创建形状。这意味着,形状将处于随机位置。每个创建的形状将被存储到数组列表中。之后,我将通过操纵x轴重新排列形状位置。
假设以下情况:
在宽度和高度均为200的面板中创建5个形状。 在对齐之前,每个形状的位置如下:
然后将所有这5个形状存储到 Shape s 。
请注意,我只是重新调整x轴的位置。 Y轴将是恒定的。
实施
现在,我们将新的起始位置初始化为0; 有1个变量;空格由width / numberofshapes决定。 给定宽度= 200;并创建了5个形状。因此空间是40。 这些空间用于确定形状之间的间隙。
所以我的问题是,它没有像我希望的那样工作。 以下是我的插图和代码实现。
原始代码
else if(command.equals("Align")){
int currentPosition = 0;
int spaces = 500 / shapes.size();
for (Shape s : shapes) {
s.setX(currentPosition);
currentPosition = s.getX() + spaces;
}
repaint();
}
修订代码 - 实施排序
else if(command.equals("Align")){
int currentPosition = 0;
int spaces = 500 / shapes.size();
ArrayList<Shape> sortedShapes = new ArrayList<Shape>();
sortedShapes.addAll(shapes);
Collections.sort(sortedShapes, new Comparator<Shape>() {
@Override
public int compare(final Shape object1, final Shape object2) {
return object1.getX() < object2.getX() ? -1 : object1.getX() == object2.getX() ? 0 : 1;
}
});
for (Shape s : sortedShapes) {
s.setX(currentPosition);
currentPosition = s.getX() + spaces;
}
repaint();
}
图片插图:
在:
后:
我正面临当前的问题,如下所示:
在:
后:
正如您在实现对齐代码后所看到的,所有形状都向右移动,其中一个实际上超出了边界。这不是我想要的。
答案 0 :(得分:2)
您必须先对形状进行排序,因此第一个形状是最左边的形状,最后一个形状是最右边的形状。这应该有效:
if(command.equals("Align")){
int currentPosition = 0;
int spaces = 500 / shapes.size();
List<Shape> sortedShapes = new ArrayList<Shape>();
sortedShapes.addAll(shapes);
Collections.sort(sortedShapes, new Comparator<Shape>() {
@Override
public int compare(final Shape object1, final Shape object2) {
return object1.getX() < object2.getX() ? -1 : object1.getX() == object2.getX() ? 0 : 1;
}
});
for (Shape s : sortedShapes) {
s.setX(currentPosition);
currentPosition = s.getX() + spaces;
}
repaint();
}