2017-04-14 152 views
1

我試圖做一個有點滑塊謎類遊戲,你點擊1圖像,然後點擊另一個,他們交換位置。出於某種原因,第一次這樣做會正常工作,但是當您第二次交換圖像時,每次都會選擇與您單擊的圖像不同的元素。任何幫助將appreachated,謝謝。在ArrayList中交換元素

public class test extends Application { 
int click1 = -1, click2 = -1; 

public static void main(String[] args) { 
    Application.launch(args); 
} 

@Override 
public void start(Stage primaryStage) throws Exception { 
    //Create a GridPane 
    GridPane pane = new GridPane(); 
    pane.setAlignment(Pos.CENTER); 
    pane.setHgap(5); 
    pane.setVgap(5); 

    //create ArrayList and add imageList to ArrayList 
    ArrayList<ImageView>imageList = new ArrayList<ImageView>(); 
    for (int i = 0; i < 9; i++) { 
     imageList.add(new ImageView ((i) +".jpg")); 
    }  

    addImages(imageList, pane); 

    //add onClick listeners to each image 
    imageList.get(0).setOnMouseClicked(e->{ 
     swap(0, imageList, pane); 
    }); 
    imageList.get(1).setOnMouseClicked(e->{ 
     swap(1, imageList, pane); 
    }); 
    imageList.get(2).setOnMouseClicked(e->{ 
     swap(2, imageList, pane); 
    }); 
    imageList.get(3).setOnMouseClicked(e->{ 
     swap(3, imageList, pane); 
    }); 
    imageList.get(4).setOnMouseClicked(e->{ 
     swap(4, imageList, pane); 
    }); 
    imageList.get(5).setOnMouseClicked(e->{ 
     swap(5, imageList, pane); 
    }); 
    imageList.get(6).setOnMouseClicked(e->{ 
     swap(6, imageList, pane); 
    }); 
    imageList.get(7).setOnMouseClicked(e->{ 
     swap(7, imageList, pane); 
    }); 
    imageList.get(8).setOnMouseClicked(e->{ 
     swap(8, imageList, pane); 
    }); 

    //display the scene 
    Scene scene = new Scene(pane, 650, 650); 
    primaryStage.setScene(scene); 
    primaryStage.setTitle("Test"); 
    primaryStage.show(); 
} 

private void swap(int lastClick, ArrayList<ImageView> imageList, GridPane pane) { 
    if (click1 == -1) { 
     click1 = lastClick; 
     System.out.println(imageList.get(click1).getImage().impl_getUrl()+ " "); 

     imageList.get(click1).setScaleX(1.02); 
     imageList.get(click1).setScaleY(1.02); 
    } else { 
     click2 = lastClick; 
     System.out.println(imageList.get(click2).getImage().impl_getUrl()+ " "); 

     //swap indexes in ArrayList 
     Collections.swap(imageList, click2, click1); 
     pane.getChildren().removeAll(imageList); 
     addImages(imageList, pane); 

     //reset everything for next swap 
     imageList.get(click1).setScaleX(1.0); 
     imageList.get(click1).setScaleY(1.0); 
     imageList.get(click2).setScaleX(1.0); 
     imageList.get(click2).setScaleY(1.0);   
     click1 = -1; 
     click2 = -1; 
    } 
} 

private void addImages(ArrayList<ImageView> imageList, GridPane pane) { 
    //add imageList to the GridPane 
    int i = 0; 
    while (i < 9) { 
     for (int j = 0; j <= 2; j++) { 
      for (int k = 0; k <= 2; k++) { 
       pane.add(imageList.get(i), k, j); 
       i++; 
      } 
     } 
    } 
} 

}

+0

更新鼠標點擊偵聽器,一旦您用新索引單擊它。 – Compass

+0

你真了不起!我不太清楚爲什麼這會讓它工作,如果你不介意可以稍微解釋一下,這樣我可以更好地理解它?非常感謝你,雖然我很欣賞它。 –

回答

0

您需要更新鼠標點擊監聽器,一旦你更新了新的元素。最終發生的是一個陳舊的狀態。移動的物品會報告其初始位置而不是其實際位置,導致物品移動到不應該位置的位置。

基本狀態。

0, 1, 2, 3, 4, 5, 6, 7, 8

假設我們單擊3,然後5.請求是交換圖像5至圖像3的狹槽,和圖像3到圖像5的插槽中。

0, 1, 2, 5, 4, 3, 6, 7, 8

這看起來正確的了,但讓我們嘗試另一種交換。讓我們交換圖像1 5

0, 3, 2, 5, 4, 1, 6, 7, 8

發生了什麼事?點擊1和5,但是3和1交換位置!

後端工作實際上按照設計完成。圖像5和圖像1被點擊,從而導致在操作「交換插槽5時隙1,而不是預期的插槽3時隙1。與的問題是,在槽5的圖像是實際上圖像3.

這種情況的整改更新鼠標點擊聽衆知道他們在哪裏之後,這樣他們就可以申報新,更新位置

修復將是:

imageList.get(click1).setOnMouseClicked(e->{ 
    swap(click1, imageList, pane); 
}); 
imageList.get(click2).setOnMouseClicked(e->{ 
    swap(click2, imageList, pane); 
}); 

這告訴交換項目「這是您移動的位置,從現在開始,您應該報告這是您新移動的位置。」