如何使用按钮在javafx中更改图像

如何使用按钮在javafx中更改图像,java,javafx,Java,Javafx,为了尽可能清晰,该程序应显示随机选择的4张卡,然后在其下方有一个按钮,可从52张卡中随机重置所有卡。然而,我对如何在行动事件中做到这一点感到困惑。(另外,作为额外的奖励,我似乎无法让按钮显示在卡片下面,而只是将整个屏幕从卡片和按钮上移开)任何帮助都将不胜感激 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.i

为了尽可能清晰,该程序应显示随机选择的4张卡,然后在其下方有一个按钮,可从52张卡中随机重置所有卡。然而,我对如何在行动事件中做到这一点感到困惑。(另外,作为额外的奖励,我似乎无法让按钮显示在卡片下面,而只是将整个屏幕从卡片和按钮上移开)任何帮助都将不胜感激

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.scene.control.Button;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.layout.GridPane;
import javafx.event.ActionEvent;

public class GenerateCards extends Application {

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

    }
public int cardNum(){
     int Num = (int) Math.ceil(Math.random()*52);
     return Num;
}
    public void start(Stage primaryStage) {

        primaryStage.setTitle("Random Card");

                GridPane pane = new GridPane();
                pane.setAlignment(Pos.CENTER);
                pane.setHgap(10);
                pane.setVgap(5);

                // creates button 
                Button refresh = new Button("Refresh");
               HBox button = new HBox(10);
               button.setAlignment(Pos.BOTTOM_CENTER);
               button.getChildren().add(refresh);
               pane.getChildren().add(refresh);

               // creates random card images and adds them to pane
               Image img = new Image("card/"+cardNum()+".png");
               ImageView imgView = new ImageView(img);
               pane.add(imgView, 1, 0);

               Image img2= new Image("card/"+cardNum()+".png");
               ImageView imgView2 = new ImageView(img2);
               pane.add(imgView2, 2, 0);

               Image img3= new Image("card/"+cardNum()+".png");
               ImageView imgView3 = new ImageView(img3);
               pane.add(imgView3, 3, 0);

               Image img4= new Image("card/"+cardNum()+".png");
               ImageView imgView4 = new ImageView(img4);
               pane.add(imgView4,4, 0);
               //create scene
               Scene scene = new Scene(pane,400,200);
               primaryStage.setScene(scene);
               primaryStage.show();
               refresh.setOnAction(new EventHandler<ActionEvent>() {
                        public void handle(ActionEvent e){
                       // where im confused
                        }
                });

    }
}   
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.HBox;
导入javafx.stage.stage;
导入javafx.scene.control.Button;
导入javafx.event.EventHandler;
导入javafx.geometry.Pos;
导入javafx.scene.layout.GridPane;
导入javafx.event.ActionEvent;
公共类GenerateCards扩展了应用程序{
公共静态void main(字符串[]args){
应用程序启动(args);
}
public int cardNum(){
int Num=(int)Math.ceil(Math.random()*52);
返回Num;
}
公共无效开始(阶段primaryStage){
初级阶段。设置标题(“随机卡”);
GridPane=新建GridPane();
窗格设置对齐(位置中心);
窗格。setHgap(10);
窗格。设置间隙(5);
//创建按钮
按钮刷新=新按钮(“刷新”);
HBox按钮=新HBox(10);
按钮。设置对齐(位置底部\中心);
button.getChildren().add(刷新);
pane.getChildren().add(刷新);
//创建随机卡片图像并将其添加到窗格中
图像img=新图像(“card/”+cardNum()+“.png”);
ImageView imgView=新的ImageView(img);
添加(imgView,1,0);
Image img2=新图像(“card/”+cardNum()+“.png”);
ImageView imgView2=新的ImageView(img2);
添加(imgView2,2,0);
Image img3=新图像(“card/”+cardNum()+“.png”);
ImageView imgView3=新的ImageView(img3);
添加(imgView3,3,0);
Image img4=新图像(“card/”+cardNum()+“.png”);
ImageView imgView4=新的ImageView(img4);
窗格。添加(imgView4,4,0);
//创建场景
场景=新场景(窗格,400200);
初级阶段。场景(场景);
primaryStage.show();
refresh.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent e){
//我在哪里困惑
}
});
}
}   

Math.random()*4返回一个介于0和4之间的数字。首先,将
img
img2
img3
img4
放入
ArrayList
。然后从前面提到的函数中获取一个随机索引,在
ArrayList
中获取该索引处的图像,并刷新它

在按钮操作处理程序中,只需重置每个图像视图中的图像即可

refresh.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent e) {
        imgView.setImage(new Image("card/" + cardNum() + ".png"));
        imgView2.setImage(new Image("card/" + cardNum() + ".png"));
        imgView3.setImage(new Image("card/" + cardNum() + ".png"));
        imgView4.setImage(new Image("card/" + cardNum() + ".png"));
    }
});
refresh.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent e){
setImage(新图像(“card/”+cardNum()+“.png”);
setImage(新图像(“card/”+cardNum()+“.png”);
setImage(新图像(“card/”+cardNum()+“.png”);
设置图像(新图像(“card/”+cardNum()+“.png”);
}
});

很抱歉,在我试图在编辑中清除之前我有点不清楚,我的问题是我不知道如何重新显示按钮事件中的图像。另外,他们应该从我的cardNum()方法中获得一个新的随机数。感谢所有稍后看到这个的人。为了在事件中使用它们,我还必须将ImageView设置为final。你还在使用Java 7吗?在Java8中,应该不再需要将它们设置为final。请使用VBox来布局卡片下的按钮。VBox VBox=新的VBox(cardsPane,刷新按钮);谢谢你@UlukBiy我来试一试:)麻烦在于将它居中:/vbox.setAlignment()?