均匀对齐对象

时间:2015-08-20 10:43:16

标签: java swing

我正在开展一个项目,我必须首先在框架上随机创建形状。这意味着,形状将处于随机位置。每个创建的形状将被存储到数组列表中。之后,我将通过操纵x轴重新排列形状位置。

假设以下情况:

在宽度和高度均为200的面板中创建5个形状。 在对齐之前,每个形状的位置如下:

  • 形状A:x = 40,y = 70
  • 形状B:x = 60,y = 50
  • 形状C:x = 80,y = 40
  • 形状D:x = 20,y = 60
  • 形状E:x = 60,y = 20

然后将所有这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();
}

图片插图:

在:

enter image description here

后:

enter image description here

我正面临当前的问题,如下所示:

在:

enter image description here

后:

正如您在实现对齐代码后所看到的,所有形状都向右移动,其中一个实际上超出了边界。这不是我想要的。

enter image description here

1 个答案:

答案 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();
    }