2015-03-28 3 views
1

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

ObservableList<File> 
ObservableList<Node> 

или просто

ObservableList<A> 
ObservableList<B> 

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

спасибо.

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

+0

Вы не можете выполнять привязку ContentBidirectional для ObservableList разных типов. – ItachiUchiha

+0

Есть ли способ связать список пользовательского интерфейса и мой собственный список вместе? – Felix

+0

Почему вы хотите это сделать? Может быть, если вы сообщите нам, чего вы пытаетесь достичь, может возникнуть альтернативный подход к нему. – ItachiUchiha

ответ

2

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

Я создал пример, в котором у меня есть 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(); 
    } 
} 

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

Кроме того, вы также можете добавить слушателей в 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

Спасибо. Оно работает. – Felix

Смежные вопросы