2015-08-20 79 views
1

我正在開發一個項目,我必須首先在框架上隨機創建形狀。意思是說,形狀將在隨機位置。每個創建的形狀將被存儲到數組列表中。之後,我將通過操縱x軸來重新排列形狀位置。均勻地對齊對象

假設以下情況:

5周的形狀在一個面板中創建與寬度和高度的200 對齊之前,每個形狀的位置是如下:

  • 形狀A: X = 40,Y = 70
  • 形狀B:X = 60,Y = 50
  • 形狀C:X = 80,Y = 40
  • 小號HAPE d:X = 20,Y = 60
  • 形狀E:X = 60,Y = 20種

所有這些5種形狀,將隨後被存儲到形狀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

@JensSchauder,我用圖像更新了帖子,圖片顯示了我目前存在的問題。 – MkLim

+0

這很奇怪,因爲你將currentPosition(它是0)設置爲第一個Shape,所以至少有一個Shape應該是0 x。我建議您在更改之前在每個循環中打印currentPosition的值。 – Emd4600

回答

2

你有你的形狀第一排序,所以第一個形狀是一個lefmost,最後形狀最右邊的一個。這應該工作:

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(); 
    } 
+0

阿..我幾乎忘記排序列表,但是,現在的對象不動。 – MkLim

+0

它可以是我的setX方法嗎? 'public void setX(int currentPosition){ \t \t moveTo(currentPosition,0); \t \t // TODO自動生成方法存根 \t}' – MkLim

+0

IIRC,您的moveTo遞增位置。 getX()改變它的絕對位置會更好, – Emd4600