JavaFX с использованием Vbox в качестве контейнера для списка товаров - PullRequest
0 голосов
/ 23 декабря 2018

Я хочу создать POS-приложение.Я оцениваю способ, которым odoo erp создает список товаров для поиска.каждый продукт указан в контейнере с изображением и некоторыми сведениями о продукте.Я хочу сделать это в JavaFX, используя TilePane -> Hbox -> ImageView + Vbox -> Метки для каждого продукта.Итак, мне нужны предложения от экспертов.Что такое снижение производительности для 4000+ список продуктов.Есть ли способ правильно реализовать это в JavaFX

enter image description here

Вот фрагмент из кода контроллера:

/*   The code get a list of products from database using JPA repositories
    Create a filtredlist in to filter list based on textfiled
   for each product :
      create a Hbox node that contains ImageView and Vbox witch contains some lables
    add the Hbox to Tilepane
*/ 

@FXML
TilePane tpListProduct;
@FXML
JFXTextField tfsearch;

  private void initData() {
        List<Product> productList = Lists.newArrayList(productRepository.findAll());
        FilteredList<Product> filtredList = new FilteredList(FXCollections.observableArrayList(productList), e -> true);


        ObjectProperty<Predicate<Product>> productFiltredPredicate = new SimpleObjectProperty<>();
        productFiltredPredicate.bind(Bindings.createObjectBinding(() ->
                        product -> {
                            if (Objects.equals(product.getNameFR(), null))
                                return false;
                            if (product.getNameFR().toLowerCase().contains(tfsearch.getText().trim().toLowerCase()))
                                return true;
                            else return false;
                        }
                , tfsearch.textProperty()));


        filtredList.predicateProperty().bind(productFiltredPredicate);


        productFiltredPredicate.addListener((observable, oldValue, newValue) -> {
            tpListProduct.getChildren().clear();
            filtredList.forEach(product -> {
                tpListProduct.getChildren().add(createProductTile(product));
            });
        });


    }

    private Node createProductTile(Product product) {
        String cssLayout = "-fx-border-color: red;\n" +
                "-fx-border-insets: 5;\n" +
                "-fx-border-width: 3;\n" +
                "-fx-border-style: dashed;\n";
        HBox hBox = new HBox();
        hBox.setStyle(
                cssLayout
                );
        VBox vBox = new VBox();
        ImageView iv = new ImageView();
        iv.setFitWidth(200);
        iv.setFitHeight(200);
        //  iv.setViewport(new Rectangle2D(2, 2, 2, 2));

        if (product.getImagePath() != null)
            iv.setImage(new Image("file:///" + product.getImagePath()));

        vBox.getChildren().add(new Label(product.getNameFR()));
        hBox.getChildren().addAll(iv, vBox);
        hBox.setOnMouseClicked(event -> {
            System.out.println(event.getSource());
        });

        return hBox;
    }
...