JavaFX TreeTableView работает медленно при расширении узлов? - PullRequest
0 голосов
/ 28 июня 2018

мы используем TreeTabelView для просмотра продуктов с субпродуктами. Но когда мы нажимаем на треугольник, чтобы развернуть узел, возникает очень большая задержка (около 1000 мс).

Вот код:

package controller;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.control.cell.TreeItemPropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import loginPackage.DBConnection;
import model.Product;
import model.ProductType;

import java.net.URL;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

public class ShowSetsController implements Initializable{
    @FXML
    private TreeTableView TTVShowSets;
    @FXML
    private TreeTableColumn tcShowSetsProductName, tcShowSetsDescription;
    @FXML
    private TextField tfSearch;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        TTVShowSets.setVisible(true);
        tcShowSetsProductName.setCellValueFactory(new TreeItemPropertyValueFactory<>("productTypeName"));
        tcShowSetsDescription.setCellValueFactory(new TreeItemPropertyValueFactory<>("productTypeDescription"));

        List<Product> setHeaders = null;
        try {
            setHeaders = DBConnection.getInstance().getHighestSetHeaders();
        } catch (SQLException e) {
            e.printStackTrace();
            e.printStackTrace();
        }

        TTVShowSets.setRoot(null);
        TreeItem<Product> root = new TreeItem<>(new Product(-1,null,null,null, null, null));
        for (int i = 0; i < setHeaders.size(); i++){
            TreeItem<Product> cache = new TreeItem<>(setHeaders.get(i));
            try {
                this.printSetsTree(setHeaders.get(i), cache);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            root.getChildren().add(cache);
        }
        TTVShowSets.setShowRoot(false);
        TTVShowSets.setRoot(root);
    }

    public void printSetsTree(Product head, TreeItem<Product> father) throws SQLException {
        List<Product> listOfChildren = DBConnection.getInstance().getProductsChildrenByProductID(head);
        for(int i = 0; i < listOfChildren.size(); i++) {
            listOfChildren.get(i).setIsChild(true);
            listOfChildren.get(i).setSelected(null);
            TreeItem<Product> child = new TreeItem<>(listOfChildren.get(i));
            father.getChildren().add(child);
            Product childProduct = listOfChildren.get(i);
            printSetsTree(childProduct,child);
        }
    }
    @FXML
    private  void serachProduct(KeyEvent event) throws SQLException {
        TTVShowSets.setVisible(true);
        TTVShowSets.setRoot(null);
        KeyCode keycode = event.getCode();
        String search = tfSearch.getText();
        if(keycode == KeyCode.BACK_SPACE && search.length() > 0){
            search = search.substring(0,search.length()-1);
        }
        else search += event.getText();

        TreeItem<Product> root = new TreeItem<>(new Product(-1, null, null, null, null, null)); //empty root element
        List<Product> listHeaders = DBConnection.getInstance().getHighestSetHeaders();
        for (Product listHeader : listHeaders){
            TreeItem<Product> parent = new TreeItem<>(listHeader);
            List<Product> childs = DBConnection.getInstance().getProductsByProductTypeIdWhichAraNotInaSet(listHeader.getProducttypeID());
            for(Product child : childs){
                if (listHeader.getProductTypeName().toLowerCase().contains(search.toLowerCase())){
                    child.setIsChild(true);
                    TreeItem<Product> cache = new TreeItem<>(child);
                    printSetsTree(child, cache);
                    parent.getChildren().add(cache);
                }
            }
            if (parent.getChildren().size() > 0 && listHeader.getProductTypeName().toLowerCase().contains(search.toLowerCase())){
                root.getChildren().add(parent);
            }
            else TTVShowSets.setVisible(false);
        }
        TTVShowSets.setShowRoot(false);
        TTVShowSets.setRoot(root);
    }
    @FXML
    public void refreshTTV(){
        TTVShowSets.refresh();
    }
}

Может быть, реализация ложна или запрос к базе данных слишком медленный, но мы не думаем, что это является причиной, потому что TreeTableView загружается со всеми узлами при инициализации панели? Спасибо за ваше время и помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...