我正在尝试制作一个随机显示4张卡片的程序,然后当我再次单击该按钮时,它将清除旧的设置并显示一个新的随机设置。
现在,当我点击按钮时,我的程序将显示4张随机的卡片图像;但是,当我再次尝试点击它时,没有任何反应。我假设它与清除根孩子后不再注册到按钮的EventHandler
有关。但是,我不知道如何解决这个问题。任何帮助是极大的赞赏!我还没有找到答案,并且只学习JavaFX大约一周。谢谢。
到目前为止我的代码:
public class CardShuffle extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
StackPane root = new StackPane();
Scanner input = new Scanner(System.in);
File cardsFolder = new File("C:\\Users\\timsp\\Pictures\\JPEG");
ArrayList<File> cardsFilePaths = new ArrayList<File> (Arrays.asList(cardsFolder.listFiles()));
Button deal = new Button("DEAL");
Pane hb = new HBox(10);
hb.setPadding(new Insets(5, 5, 5, 5));
root.getChildren().add(deal);
deal.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
root.getChildren().clear();
ArrayList<ImageView> cards = getRandomCards(cardsFilePaths);
for (int i = 0; i < 4; i++) {
cards.get(i).setFitWidth(150);
cards.get(i).setFitHeight(100);
hb.getChildren().add(cards.get(i));
}
root.getChildren().addAll(deal, hb);
}
});
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
public ArrayList<ImageView> getRandomCards(ArrayList<File> cardsFilePaths) {
ArrayList<ImageView> cards = new ArrayList<ImageView>();
try {
for (int i = 0; i < 4; i++) {
Image card = new Image((new FileInputStream(cardsFilePaths.get((int) (Math.random() * 52)).getPath())));
ImageView temp = new ImageView();
temp.setImage(card);
cards.add(temp);
}
} catch (FileNotFoundException e) {
e.getMessage();
}
return cards;
}
}
答案 0 :(得分:0)
这里有很多问题:
root
布局:你使用StackPane,你应该做的第一件事是用{替换它'例如{1}}并重新运行您的程序,将更容易看到真正发生的事情。 (你不会有4张卡,但是8,12,16等等)。
VBox
,您将root.getChildren().addAll(deal, hb);
布局放在按钮上方,然后点击首先由HBox消耗。这是一个更容易看到它的例子:
HBox
// Add the HBox as soon as the initialization
root.getChildren().add(deal);
hb.setOnMouseClicked(e -> System.out.println("HBox clicked"));
deal.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
root.getChildren().clear();
ArrayList<ImageView> cards = getRandomCards(cardsFilePaths);
for(int i = 0; i < 4; i++) {
cards.get(i).setFitWidth(150);
cards.get(i).setFitHeight(100);
hb.getChildren().add(cards.get(i));
}
hb.setStyle("-fx-background-color:CORNFLOWERBLUE;-fx-opacity:0.8;");
root.getChildren().addAll(deal, hb);
}
});
个孩子,你想要的是用另外4个孩子替换你的卡片。因此,没有必要删除root
,只能操纵button
,如下例所示:
HBox