JavaFX bindContentBidirectional различных типов списков

1

Если у вас есть два разных списка.

ObservableList<File>
ObservableList<Node>

или просто

ObservableList<A>
ObservableList<B>

Как вы связываете это вместе? Есть ли какое-либо преобразование или что-то в этом роде?

Спасибо.

Реферат - https://stackoverflow.com/a/29320895/1347177

  • 0
    Вы не можете выполнить привязку ContentBidirectional для ObservableList разных типов.
  • 0
    Есть ли способ связать список пользовательского интерфейса и мой пользовательский список вместе?
Показать ещё 4 комментария
Теги:
javafx
binding
bind

1 ответ

2
Лучший ответ

Вы можете прослушать change в ObservableList of Files и для каждого нового добавления добавить в ImageView VBox соответствующий ImageView.

Я создал пример, в котором у меня есть ObservableList из String, который представляет собой список URL of images. При нажатии кнопки я добавляю в список новый URL-адрес (тот же адрес). У меня есть ListChangeListener который слушает добавление строк и добавляет ImageView в VBox для него.

Я слушаю Addition. Вы также можете добавить для Removal.

public class Main extends Application {

    private final String IMAGE_PATH = "http://i.imgur.com/fcn1bFx.jpg";
    private final ObservableList<String> listOfImages = FXCollections.observableArrayList();

    @Override
    public void start(Stage primaryStage) throws Exception {
        ScrollPane pane = new ScrollPane();
        VBox box = new VBox();
        box.setSpacing(10);
        box.setAlignment(Pos.CENTER);

        Button button = new Button("Add");
        button.setOnAction( e -> {
            listOfImages.add(IMAGE_PATH);
        });
        listOfImages.addListener((ListChangeListener<String>) c -> {
            c.next();
            if (c.wasAdded()) {
                box.getChildren().add(0, new ImageView(c.getAddedSubList().get(0)));
            }
        });
        box.heightProperty().addListener((ov, oldValue, newValue) -> {
            pane.setVvalue(pane.getVmax());
        });

        box.getChildren().add(button);
        pane.setContent(box);
        Scene scene = new Scene(pane, 500, 500);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

Это не двунаправленная привязка, а заполнение ваших потребностей.

Кроме того, вы также можете добавить Listeners в VBox и внести соответствующие изменения в ObservableList.

box.getChildren().addListener(new ListChangeListener<Node>() {
     @Override
     public void onChanged(Change<? extends Node> c) {
         c.next();
         if(c.wasRemoved()){
              listOfImages.remove(c.getList().get(0));
         }
     }
});
  • 0
    Спасибо. Оно работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню