Java 如何从vbox获取ChildName

Java 如何从vbox获取ChildName,java,javafx,filenames,mouseclick-event,Java,Javafx,Filenames,Mouseclick Event,按下按钮后,我需要在vbox中获取imageview的文件名??此处文件arraylist已添加到vbox,vbox到gridpane是否可以使用vbox.getChildren()??否则我该如何继续。 以下是一个屏幕截图,以便更好地理解: 代码如下: private ArrayList<Button> btnar; private VBox vb; private Button downloadbtn; @FXML private ScrollPane displayscrol

按下按钮后,我需要在vbox中获取imageview的文件名??此处文件arraylist已添加到vbox,vbox到gridpane是否可以使用vbox.getChildren()??否则我该如何继续。 以下是一个屏幕截图,以便更好地理解:

代码如下:

private ArrayList<Button> btnar;
private VBox vb;
private Button downloadbtn;
@FXML
private ScrollPane displayscroll;
private GridPane gridpane;

public HomeUI_2Controller() {
   Platform.runLater(new Runnable() {

     @Override
     public void run() {
        gridpane = new GridPane();
        displayscroll.setContent(gridpane);

        btnar = new ArrayList<>();
        for (int i = 0; i < filelist2.size(); i++) {
            downloadbtn = new Button("Download");
            btnar.add(downloadbtn);
        }
        int imageCol = 0;
        int imageRow = 0;

        for (int i = 0; i < filelist2.size(); i++) {
            System.out.println(filelist2.get(i).getName());

            image = new Image(filelist2.get(i).toURI().toString());

            pic = new ImageView();
            pic.setFitWidth(130);
            pic.setFitHeight(130);

            pic.setImage(image);
            vb = new VBox();
            vb.getChildren().addAll(pic, (Button) btnar.get(i));

            gridpane.add(vb, imageCol, imageRow);
            GridPane.setMargin(pic, new Insets(2, 2, 2, 2));
            imageCol++;

            // To check if all the 3 images of a row are completed
            if (imageCol > 2) {
                // Reset Column
                imageCol = 0;
                // Next Row
                imageRow++;
            }

        }
         **downloadbtn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {
                System.out.println("sssss");
                System.out.println( vb.getChildren().contains(pic.getId()));
            }
        });**
   }
   });
}
private ArrayList btnar;
私有vboxvb;
私人按钮下载;
@FXML
私有滚动窗格显示滚动;
私有网格窗格;
公共HomeUI_2控制器(){
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
gridpane=新的gridpane();
displayscroll.setContent(网格窗格);
btnar=新的ArrayList();
对于(int i=0;i2){
//重置列
imageCol=0;
//下一排
imageRow++;
}
}
**downloadbtn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent arg0){
系统输出打印LN(“SSS”);
System.out.println(vb.getChildren().contains(pic.getId());
}
});**
}
});
}

这个代码真的不清楚,我不确定我是否完全理解你在这里做什么。(这是控制器吗?如果是,为什么要在构造函数内部的
平台.runLater()
中初始化UI,而不是在标准的
initialize()
方法中初始化UI?为什么一些UI组件显然是在FXML中定义的,而其他组件是在控制器的Java代码中定义的?这很难理解。)

但是,您似乎有一个名为
filelist2
列表(您没有显示声明),我猜它包含文件名。您可以创建一个相同大小的
按钮的列表。我猜这个想法是向每个按钮添加一个动作事件处理程序,该按钮对
filelist2
列表的相应元素执行某些操作

为此,您可以将事件处理程序添加到第一个
for
循环中的每个按钮:

    for (int i = 0; i < filelist2.size(); i++) {
        downloadbtn = new Button("Download");
        btnar.add(downloadbtn);
        final int index = i ;
        downloadbtn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                // do something with filelist2.get(index);
                // ...
            }
        });
    }
for(int i=0;i
+1第一段:)您的代码片段没有遵循JavaFX模式。阅读有关如何在JavaFX中使用FXML编码的说明!正如@James_D已经指出的,您有一个控制器,并且在其构造函数中使用
Platform.runLater()
,这确实令人困惑。要了解有关FXML和控制器的更多信息,请通读以下示例: