不同类型Lists的JavaFX bindContentBidirectional
JavaFX bindContentBidirectional of different types of Lists
如果您有两个不同的列表。
ObservableList<File>
ObservableList<Node>
或者只是
ObservableList<A>
ObservableList<B>
如何绑定在一起?有什么转换之类的吗?
谢谢。
Referal -
您可以在 Files
的 ObservableList
中收听 change
并且对于每个新添加的 ImageView
添加相应的 ImageView
到 VBox
。
我创建了一个示例,其中我有一个 ObservableList
的字符串,它是一个 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
中添加Listener,并对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));
}
}
});
如果您有两个不同的列表。
ObservableList<File>
ObservableList<Node>
或者只是
ObservableList<A>
ObservableList<B>
如何绑定在一起?有什么转换之类的吗?
谢谢。
Referal -
您可以在 Files
的 ObservableList
中收听 change
并且对于每个新添加的 ImageView
添加相应的 ImageView
到 VBox
。
我创建了一个示例,其中我有一个 ObservableList
的字符串,它是一个 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
中添加Listener,并对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));
}
}
});