在javafx中对ObservableList项添加操作

时间:2014-01-20 15:21:49

标签: javafx-2

我正在使用javafx创建一个ListView,其中添加包含按钮的Observable List。 我想在此列表中的每个按钮上添加操作。任何帮助......

ObservableList videoLists = null;
    if (listView.getSelectionModel().getSelectedItem().equals("class 8")) {
        classTitleID.setText("class 8 video lists");
        File physicsFolder = new File("D:\\videos\\physics");
        File[] listOfFiles = physicsFolder.listFiles();
        videoLists = FXCollections.observableArrayList();
        for (File file : listOfFiles) {
            if (file.isFile()) {
                videoLists.add(new Button(file.getName()));
                physicsListview.setItems(videoLists);
            }
        }
    } 

2 个答案:

答案 0 :(得分:1)

简单地做

for (File file : listOfFiles) {
        if (file.isFile()) {
    Button button = new Button(file.getName());
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            //your action
        }
    });
            videoLists.add(button);
            physicsListview.setItems(videoLists);
        }
    }

答案 1 :(得分:0)

Node子类作为ListView s(或TableView s,ComboBox es等中的数据类型通常是个坏主意:它会破坏MVC。让ListView成为ListView<File>并使用cellFactory来显示ListView单元格中的按钮。您可以在那里设置动作处理程序。

ListView<File> physicsListview = new ListView<>();
ObservableList<File> videoLists = FCollections.observableArrayList();
//...
for (File file : listOfFiles) {
  if (file.isFile()) {
    videoLists.add(file);
  }
}
physicsListview.setItems(videoLists);

physicsListview.setCellFactory(new Callback<ListView<File>, ListCell<File>>() {
  @Override
  public ListCell<File> call(ListView<File>()) {
    final Button button = new Button();
    return new ListCell<File>() {
      @Override
      public void updateItem(final File item, boolean empty) {
        super.updateItem(item, empty);
        if (empty) {
          setGraphic(null);
        } else {
          button.setText(item.getName());
          button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
              // handle action. 
              // You can access the File object item here if needed
            }
          });
          setGraphic(button);
        }
      }
    };
  });
});