我正在尝试制作一个有点滑块拼图的游戏,你点击1张图片,然后点击另一张并交换位置。出于某种原因,这在第一次使用时可以正常工作,但是当您第二次交换图像时,每次都会选择与您单击的元素不同的元素。任何帮助都是适用的,谢谢。
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 :(得分: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
现在看起来正确,但让我们尝试另一个交换。让我们用5交换图像1。
0, 3, 2, 5, 4, 1, 6, 7, 8
发生什么事了?!点击了1和5,但改为3和1交换位置!
后端工作的举动实际上与设计完全一致。单击图像5和图像1,导致操作&#34;交换插槽5 与插槽1 ,而不是预期的插槽3 插槽1 。问题在于插槽5中的图像实际上是图像3。
对此进行更正是为了更新鼠标点击监听器以了解它们之后的位置,以便他们报告新的更新位置。
修复将是:
imageList.get(click1).setOnMouseClicked(e->{
swap(click1, imageList, pane);
});
imageList.get(click2).setOnMouseClicked(e->{
swap(click2, imageList, pane);
});
这告诉交换的项目&#34;这是您移动的位置,从现在开始,您应该报告这是您的新移动位置。&#34;