Page 1 of 1

Wie erstelle ich eine einfache benutzerdefinierte Haut mit virtuellem Fluss?

Posted: 17 Mar 2025, 13:04
by Anonymous
Ich muss eine benutzerdefinierte Komponente mit VirtualFlow erstellen. Wenn ich es manuell erstelle, habe ich keine Probleme. Jetzt möchte ich versuchen, es mit einem benutzerdefinierten Skin zu erstellen. Dies ist mein Code: < /p>
public class NewMain extends Application {

public static class MyControl extends Control {

private ObservableList items;

public MyControl(ObservableList items) {
this.items = items;
setSkin(new MySkin(this));
}

public ObservableList getItems() {
return items;
}
}

public static class MySkin extends VirtualContainerBase {

public MySkin(MyControl c) {
super(c);
getChildren().add(getVirtualFlow());
getVirtualFlow().setCellFactory(vf -> new VirtualCell() {
@Override
public void updateIndex(int index) {
super.updateIndex(index);
if (index >= 0 && index < getSkinnable().getItems().size()) {
updateItem(getSkinnable().getItems().get(index), false);
} else {
updateItem(null, true);
}
}
});
getVirtualFlow().setCellCount(getSkinnable().getItems().size());
}

@Override
protected int getItemCount() {
return getSkinnable().getItems().size();
}

@Override
protected void updateItemCount() {

}
}

public static class VirtualCell extends IndexedCell {

private static int counter = 0;

public VirtualCell() {
System.out.println("Created:" + counter);
counter++;
}

@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
} else {
setText(item.toString());
}
}

@Override
protected Skin createDefaultSkin() {
return new CellSkinBase(this);
}
}

@Override
public void start(Stage primaryStage) {
List list = new ArrayList();
for (var i = 0; i < 100; i++) {
list.add("Item " + i);
}
ObservableList items = FXCollections.observableArrayList(list);
var control = new MyControl(items);
VBox.setVgrow(control, Priority.ALWAYS);
var root = new VBox(control);
Scene scene = new Scene(root, 600, 200);
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}
< /code>
Aber die Elemente werden nicht angezeigt. Könnte jemand sagen, wie man es behebt?