2017-04-14 131 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); 
}); 

这告诉交换项目“这是您移动的位置,从现在开始,您应该报告这是您新移动的位置。”