JavaFX Button EventHandler工作一次(Card Shuffler)

时间:2018-04-12 22:00:37

标签: javafx

我正在尝试制作一个随机显示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;
    }
}

1 个答案:

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