【发布时间】: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