ListView cu conținut personalizat în JavaFX (Programare, Java, Interfață Utilizator, Javafx, Javafx 8)

NCNecros a intrebat.

Cum pot face ListView personalizat cu JavaFx pentru aplicația mea. Am nevoie de HBox cu imagine și 2 etichete pentru fiecare linie listView.

Comentarii

  • Aveți nevoie de o fabrică de celule personalizate și setați cu listView.setCellFactory, voi scrie un răspuns în scurt timp. –  > Por Adam.
  • Mulțumesc. Am văzut doar exemplul pentru listView cu obiect personalizat în interiorul listei observabile, nu cu widget personalizat în interiorul celulei. –  > Por NCNecros.
  • Am adăugat un exemplu care adaugă conținut arbitrar, poate fi orice Node, TextField etc. –  > Por Adam.
1 răspunsuri
Adam

Puteți furniza o CellFactory personalizată prin intermediul vezi ListView.setCellFactory(…)

Exemplu de lucru

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Callback;

public class CustomListView extends Application {
    private static class CustomThing {
        private String name;
        private int price;
        public String getName() {
            return name;
        }
        public int getPrice() {
            return price;
        }
        public CustomThing(String name, int price) {
            super();
            this.name = name;
            this.price = price;
        }
    }

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        ObservableList<CustomThing> data = FXCollections.observableArrayList();
        data.addAll(new CustomThing("Cheese", 123), new CustomThing("Horse", 456), new CustomThing("Jam", 789));

        final ListView<CustomThing> listView = new ListView<CustomThing>(data);
        listView.setCellFactory(new Callback<ListView<CustomThing>, ListCell<CustomThing>>() {
            @Override
            public ListCell<CustomThing> call(ListView<CustomThing> listView) {
                return new CustomListCell();
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(listView);
        primaryStage.setScene(new Scene(root, 200, 250));
        primaryStage.show();
    }

    private class CustomListCell extends ListCell<CustomThing> {
        private HBox content;
        private Text name;
        private Text price;

        public CustomListCell() {
            super();
            name = new Text();
            price = new Text();
            VBox vBox = new VBox(name, price);
            content = new HBox(new Label("[Graphic]"), vBox);
            content.setSpacing(10);
        }

        @Override
        protected void updateItem(CustomThing item, boolean empty) {
            super.updateItem(item, empty);
            if (item != null && !empty) { // <== test for null item and empty parameter
                name.setText(item.getName());
                price.setText(String.format("%d $", item.getPrice()));
                setGraphic(content);
            } else {
                setGraphic(null);
            }
        }
    }

}

Comentarii

  • Da! Asta este! Vă mulțumim! –  > Por NCNecros.
  • Pot să o fac folosind fxml (elemente)? –  > Por Alexiuscrow.
  • Cum ai legat lista observabilă „data” cu vizualizarea tabelului? Se pare că lipsește ceva aici? –  > Por csotiriou.
  • @csotiriou O trece în constructor… vezi „new ListView<CustomThing>(date) <===” –  > Por Adam.