Предполагая, что MyElement
является подклассом Node
, вы можете просто выполнить
FlowPane flowPane = ... ;
FilteredList<MyElement> someFilteredList = ... ;
Bindings.bindContent(flowPane.getChildren(), someFilteredList)
Вот очень быстрый и грязный пример, который создает 100 меток с целыми значениями в качестве текста. Текстовое поле обновляет фильтр в отфильтрованном списке, поэтому будут отображаться только метки, значения которых кратны введенному значению.
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
/**
* JavaFX App
*/
public class App extends Application {
@Override
public void start(Stage stage) {
FlowPane flow = new FlowPane();
ObservableList<Label> labels = FXCollections.observableArrayList();
for (int i = 1 ; i <= 100 ; i++) {
Label label = new Label(Integer.toString(i));
label.setPadding(new Insets(1,5,0,0));
labels.add(label);
}
FilteredList<Label> filtered = new FilteredList<>(labels);
TextField filter = new TextField();
filter.setTextFormatter(new TextFormatter<String>(change ->
change.getControlNewText().matches("[0-9]*") ? change : null
));
filter.textProperty().addListener((obs, oldFilter, newFilter) -> {
String f = newFilter.trim();
if (f.isEmpty()) {
filtered.setPredicate(l -> true);
} else {
Integer divisor = Integer.parseInt(f);
filtered.setPredicate(label -> Integer.parseInt(label.getText()) % divisor == 0);
}
});
Bindings.bindContent(flow.getChildren(), filtered);
BorderPane root = new BorderPane(flow);
root.setTop(filter);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}