【问题标题】:Image is clickable and does desired change but after first-click cannot be clicked again图像是可点击的,并且做了想要的改变,但第一次点击后不能再次点击
【发布时间】:2018-03-13 22:46:20
【问题描述】:

我尝试了不同的方法来将程序更改为可操作但不完全理解事件。我正在尝试制作一个记忆游戏,因此所需的功能是在初始单击后我可以使用允许我检查图像是否匹配的条件语句重新单击图像。非常感谢任何有关达到此预期结果的帮助。

我相信这么多代码就足够了,否则请说明。

import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.image.Image ;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.io.FileInputStream;
import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;




public class memGameDriver extends Application {

    Stage window;
    GridPane grid = new GridPane();
    Scanner scan = new Scanner(System.in);

    ImageView imageOne, imageTwo, imageThree,imageFour,imageFive, imageSix,imageSeven, cardBack;
    ImageView imageReplace;

    easyDifficulty easyGame = new easyDifficulty(imageOne, imageTwo, imageThree, imageFour);

    String baseUrl = easyGame.getGSD();
    String wrongUrl = easyGame.getWrongUrl();

    Random randomGen = new Random();


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

    @Override
    public void start(Stage primaryStage) throws Exception{

        System.out.println("What difficulty?");
        String difficulty = scan.nextLine();

        makeWindow(primaryStage);

        makeGrid();

        startGame(difficulty);
        //System.out.println(numClicks);


        showWindow();

    }

    //Window
    public void makeWindow(Stage primaryStage)
    {
        this.window = primaryStage;
        this.window.setTitle("GSD Memory Game");
    }

    public void showWindow()
    {
        Scene scene = new Scene(this.grid,450,500);
        this.window.setScene(scene);
        this.window.show();
    }

    //Grid
    public void makeGrid()
    {
        this.grid.setPadding(new Insets(50,50, 50, 50)); // add padding to grid
        //Vertical and Horizontal gap
        this.grid.setVgap(50);
        this.grid.setHgap(50);
    }

    //Game
    public void startGame(String difficulty)
    {
        if(difficulty.equalsIgnoreCase("easy"))
        {
            easy();
        }
        else if(difficulty.equalsIgnoreCase("medium"))
        {
            medium();
        }
        else if(difficulty.equalsIgnoreCase("hard"))
        {
            hard();
        }

    }
    //Game difficulties
    public void easy()
    {

        int randNum = randomGen.nextInt(4)+1;
        int x = 0;

        Label title = new Label("Welcome to GSD Memory!");
        GridPane.setConstraints(title, 0 ,0);


        if(randNum == 1) {
            setOne();
        }
        else if(randNum == 2){
            setTwo();
        }
        else if(randNum == 3)
        {
            setThree();
        }
        else
        {
            setFour();
        }



        grid.getChildren().addAll(title,imageOne, imageTwo, imageThree, imageFour);


    }





    private void setFour() {


        //Display Card backs
        imageOne = createCardBacks(imageOne);
        imageTwo = createCardBacks(imageTwo);
        imageThree = createCardBacks(imageThree);
        imageFour = createCardBacks(imageFour);

        //Set grid location
        GridPane.setConstraints(imageOne, 0, 1);
        GridPane.setConstraints(imageTwo, 1, 1);
        GridPane.setConstraints(imageThree, 0, 2);
        GridPane.setConstraints(imageFour, 1, 2);
        //



         imageOne.setOnMouseClicked((MouseEvent e) -> {


            imageReplace = flipToCard(imageOne);
            GridPane.setConstraints(imageReplace, 0, 1);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageOne = flipBack(imageOne);
                                GridPane.setConstraints(imageOne, 0, 1);
                                grid.getChildren().add(imageOne);
                            }
                        });


                    } catch (InterruptedException x) {
                        x.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
            //imageOne.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
            /*

              //  event.consume();
            //});
               */

        });
        imageTwo.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToWrong(imageTwo);
            GridPane.setConstraints(imageReplace, 1, 1);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageTwo = flipBack(imageTwo);
                                GridPane.setConstraints(imageTwo, 1, 1);
                                grid.getChildren().add(imageTwo);
                            }
                        });


                    } catch (InterruptedException x) {
                        x.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });
        imageThree.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToCard(imageThree);
            GridPane.setConstraints(imageReplace, 0, 2);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageThree = flipBack(imageThree);
                                GridPane.setConstraints(imageThree, 0, 2);
                                grid.getChildren().add(imageThree);
                            }
                        });


                    } catch (InterruptedException y) {
                        y.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });
        imageFour.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToWrong(imageFour);
            GridPane.setConstraints(imageReplace, 1, 2);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageFour = flipBack(imageFour);
                                GridPane.setConstraints(imageFour, 1, 2);
                                grid.getChildren().add(imageFour);
                            }
                        });


                    } catch (InterruptedException y) {
                        y.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });

    }

    private void setThree() {


        //Display Card backs
        imageOne = createCardBacks(imageOne);
        imageTwo = createCardBacks(imageTwo);
        imageThree = createCardBacks(imageThree);
        imageFour = createCardBacks(imageFour);

        //Set grid location
        GridPane.setConstraints(imageOne, 0, 1);
        GridPane.setConstraints(imageTwo, 1, 1);
        GridPane.setConstraints(imageThree, 0, 2);
        GridPane.setConstraints(imageFour, 1, 2);
        //

        imageOne.setOnMouseClicked((MouseEvent e) -> {


            imageReplace = flipToCard(imageOne);
            GridPane.setConstraints(imageReplace, 0, 1);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageOne = flipBack(imageOne);
                                GridPane.setConstraints(imageOne, 0, 1);
                                grid.getChildren().add(imageOne);
                            }
                        });


                    } catch (InterruptedException x) {
                        x.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
            //imageOne.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
            /*

              //  event.consume();
            //});
           */

        });
        imageTwo.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToWrong(imageTwo);
            GridPane.setConstraints(imageReplace, 1, 1);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageTwo = flipBack(imageTwo);
                                GridPane.setConstraints(imageTwo, 1, 1);
                                grid.getChildren().add(imageTwo);
                            }
                        });


                    } catch (InterruptedException x) {
                        x.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });
        imageThree.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToWrong(imageThree);
            GridPane.setConstraints(imageReplace, 0, 2);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageThree = flipBack(imageThree);
                                GridPane.setConstraints(imageThree, 0, 2);
                                grid.getChildren().add(imageThree);
                            }
                        });


                    } catch (InterruptedException y) {
                        y.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });
        imageFour.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToCard(imageFour);
            GridPane.setConstraints(imageReplace, 1, 2);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageFour = flipBack(imageFour);
                                GridPane.setConstraints(imageFour, 1, 2);
                                grid.getChildren().add(imageFour);
                            }
                        });


                    } catch (InterruptedException y) {
                        y.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });

    }

    private void setTwo() {



        //Display Card backs
        imageOne = createCardBacks(imageOne);
        imageTwo = createCardBacks(imageTwo);
        imageThree = createCardBacks(imageThree);
        imageFour = createCardBacks(imageFour);

        //Set grid location
        GridPane.setConstraints(imageOne, 0, 1);
        GridPane.setConstraints(imageTwo, 1, 1);
        GridPane.setConstraints(imageThree, 0, 2);
        GridPane.setConstraints(imageFour, 1, 2);
        //
        imageOne.setOnMouseClicked((MouseEvent e) -> {


            imageReplace = flipToWrong(imageOne);
            GridPane.setConstraints(imageReplace, 0, 1);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageOne = flipBack(imageOne);
                                GridPane.setConstraints(imageOne, 0, 1);
                                grid.getChildren().add(imageOne);
                            }
                        });


                    } catch (InterruptedException x) {
                        x.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
            //imageOne.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
            /*

              //  event.consume();
            //});
        */

        });
        imageTwo.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToCard(imageTwo);
            GridPane.setConstraints(imageReplace, 1, 1);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageTwo = flipBack(imageTwo);
                                GridPane.setConstraints(imageTwo, 1, 1);
                                grid.getChildren().add(imageTwo);
                            }
                        });


                    } catch (InterruptedException x) {
                        x.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });
        imageThree.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToWrong(imageThree);
            GridPane.setConstraints(imageReplace, 0, 2);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageThree = flipBack(imageThree);
                                GridPane.setConstraints(imageThree, 0, 2);
                                grid.getChildren().add(imageThree);
                            }
                        });


                    } catch (InterruptedException y) {
                        y.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });
        imageFour.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToCard(imageFour);
            GridPane.setConstraints(imageReplace, 1, 2);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageFour = flipBack(imageFour);
                                GridPane.setConstraints(imageFour, 1, 2);
                                grid.getChildren().add(imageFour);
                            }
                        });


                    } catch (InterruptedException y) {
                        y.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });


    }

    private void setOne() {
        //Display Card backs
        imageOne = createCardBacks(imageOne);
        imageTwo = createCardBacks(imageTwo);
        imageThree = createCardBacks(imageThree);
        imageFour = createCardBacks(imageFour);

        //Set grid location
        GridPane.setConstraints(imageOne, 0, 1);
        GridPane.setConstraints(imageTwo, 1, 1);
        GridPane.setConstraints(imageThree, 0, 2);
        GridPane.setConstraints(imageFour, 1, 2);
        //


        imageOne.setOnMouseClicked((MouseEvent e) -> {


            imageReplace = flipToCard(imageOne);
            GridPane.setConstraints(imageReplace, 0, 1);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(4000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageOne = flipBack(imageOne);
                                GridPane.setConstraints(imageOne, 0, 1);
                                grid.getChildren().add(imageOne);
                            }
                        });


                    } catch (InterruptedException x) {
                        x.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
            //imageOne.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
            /*

              //  event.consume();
            //});
      */

        });
        imageTwo.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToCard(imageTwo);
            GridPane.setConstraints(imageReplace, 1, 1);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(4000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageTwo = flipBack(imageTwo);
                                GridPane.setConstraints(imageTwo, 1, 1);
                                grid.getChildren().add(imageTwo);
                            }
                        });


                    } catch (InterruptedException x) {
                        x.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });
        imageThree.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToWrong(imageThree);
            GridPane.setConstraints(imageReplace, 0, 2);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(4000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageThree = flipBack(imageThree);
                                GridPane.setConstraints(imageThree, 0, 2);
                                grid.getChildren().add(imageThree);
                            }
                        });


                    } catch (InterruptedException y) {
                        y.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });
        imageFour.setOnMouseClicked((MouseEvent e) -> {
            imageReplace = flipToWrong(imageFour);
            GridPane.setConstraints(imageReplace, 1, 2);
            grid.getChildren().add(imageReplace);

            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(4000);

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                imageFour = flipBack(imageFour);
                                GridPane.setConstraints(imageFour, 1, 2);
                                grid.getChildren().add(imageFour);
                            }
                        });


                    } catch (InterruptedException y) {
                        y.printStackTrace();
                    }
                }
            };

            Thread thread = new Thread(runnable);
            thread.start();
        });

    }



    public void medium()
    {

    }

    public void hard()
    {

    }

    ImageView createCardBacks(ImageView image)
    {
        image = new ImageView("memoryGameImages//tileBack.jpg");
        image.setFitHeight(150);
        image.setFitWidth(150);
        return image;
    }

    ImageView flipToCard(ImageView image)
    {
        image = new ImageView(baseUrl);
        image.setFitHeight(150);
        image.setFitWidth(150);
        return image;
    }

    ImageView flipToWrong(ImageView image)
    {
        image = new ImageView(wrongUrl);
        image.setFitHeight(0b10010110);
        image.setFitWidth(150);
        return image;
    }

    ImageView flipBack(ImageView image)
    {

            image = createCardBacks(image);
            return image;


    }


    /*
    private class ActionListener extends Frame implements WindowListener, ActionListener()
    {

    } */



    /*


     });

     */



}

【问题讨论】:

  • 很难说没有翻转方法,但我猜他们会创建新的ImageViews 并在GridPane 中堆叠越来越多的节点。 flipBack 方法可能没有注册监听器......我建议无论如何都要重写这些监听器,因为有很多重复的代码......另外,如果没有涉及动画,只需替换 ImageView 就足以替换图像。无需修改GridPane的孩子...
  • 我添加了所有代码来防止这样的打嗝 - 也感谢您提供有关 imageview 的提示!也许它在另一个上堆叠了一些东西,从而阻止了正确的功能。谢谢。

标签: java multithreading javafx imageview actionlistener


【解决方案1】:

您只是在第一次创建对象时设置鼠标侦听器:

imageOne.setOnMouseClicked(…

然后,通过重新分配它来丢弃 imageOne 字段中保存的 ImageView 对象:

imageOne = flipBack(imageOne);

flipBack 返回一个全新的 ImageView,您将其放置在 imageOne 字段中。您为 imageOne 中最初保存的 ImageView 调用了 setOnMouseClicked,但您从未为新的 ImageView 调用 setOnMouseClicked。

最好的解决方案是避免创建新的 ImageView。您可以轻松更改现有 ImageView 的图像:

ImageView flipToCard(ImageView image)
{
    image.setImage(new Image(baseUrl));
    image.setFitHeight(150);
    image.setFitWidth(150);
    return image;   // return same ImageView, not a new one
}

【讨论】:

  • 它告诉我“图像是抽象的,因此无法初始化”+ 感谢您抽出宝贵时间顺便查看它。
  • 您导入了错误的Image 类。您需要导入javafx.scene.image.Image,而不是 java.awt.Image。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2011-11-17
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多