交换ArrayList中的元素

时间:2017-04-14 15:27:25

标签: java arraylist javafx swap

我正在尝试制作一个有点滑块拼图的游戏,你点击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++;
            }
        }
    }   
}

}

1 个答案:

答案 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;