Ошибка динамического форматирования строки TreeTableView - PullRequest
0 голосов
/ 08 декабря 2018

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

Мое требование состоит в том, чтобы я не хотел видеть rootItems, пока он развернут, но я все еще хочу иметь возможность щелкнуть узел раскрытия, чтобы снова его свернуть.Кроме того, некоторые элементы являются единичными и будут отображаться без узла раскрытия.Другими словами, rootItems с потомками являются только представлением того, что скрыто при свертывании (например, среднее или общее их количество)

Проблемы возникают при манипулировании (свертывании / развертывании) строками пока таблица прокручивается вниз. Для воспроизведения: запустите код, разверните морковь, прокрутите вниз, раскройте картофель.

Я пытался добавить и удалить собственный стиль style вместо использования псевдокласса на всякий случай, если это было проблемой, но, похоже, он делает то же самое.

Вопросы: есть ли исправление?Я сделал что-то не так в своей rowFactory?

Дополнительный вопрос: слишком ли я честолюбив с тем, что может сделать javafx?Должен ли я использовать что-то еще, например OpenGL, для своего игрового интерфейса?

Вот простой пример:

public class RowStyling extends Application {

        @Override
        public void start(Stage primaryStage) {

                BorderPane rootPane = new BorderPane();
                Scene scene = new Scene(rootPane,200,150);
                scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
                primaryStage.setScene(scene);
                rootPane.setCenter(createTable());
                primaryStage.show();
        }

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

        @SuppressWarnings("unchecked")
        private static TreeTableView<Product> createTable() {

            TreeTableView<Product> table = new TreeTableView<>();
            TreeItem<Product> rootItem = new TreeItem<>(new Product("root",0));

            TreeItem<Product> carrots1Item = new TreeItem<Product>(new Product("carrots", 2));
            TreeItem<Product> carrots2Item = new TreeItem<Product>(new Product("carrots", 4));
            TreeItem<Product> carrots3Item = new TreeItem<Product>(new Product("carrots", 0));

            TreeItem<Product> averageCarrotsItem = new TreeItem<Product>(new Product("carrots", 2));
            averageCarrotsItem.getChildren().addAll(carrots1Item,carrots2Item,carrots3Item);

            TreeItem<Product> potatoes1Item = new TreeItem<Product>(new Product("potatoes", 0));
            TreeItem<Product> potatoes2Item = new TreeItem<Product>(new Product("potatoes", 1));
            TreeItem<Product> potatoes3Item = new TreeItem<Product>(new Product("potatoes", 2));

            TreeItem<Product> averagePotatoesItem = new TreeItem<Product>(new Product("potatoes", 1));
            averagePotatoesItem.getChildren().addAll(potatoes1Item,potatoes2Item,potatoes3Item);

            TreeItem<Product> singleVegy1Item = new TreeItem<Product>(new Product("singleVegy1", 3));
            TreeItem<Product> singleVegy2Item = new TreeItem<Product>(new Product("singleVegy2", 5));

            rootItem.getChildren().addAll(averageCarrotsItem,singleVegy1Item,singleVegy2Item,averagePotatoesItem);

            table.setRoot(rootItem);
            table.setShowRoot(false);

            TreeTableColumn<Product, String> nameCol = new TreeTableColumn<>();
            TreeTableColumn<Product, Number> quantityCol = new TreeTableColumn<>();
            nameCol.setCellValueFactory(new TreeItemPropertyValueFactory<>("name"));
            nameCol.setPrefWidth(120);
            quantityCol.setCellValueFactory(new TreeItemPropertyValueFactory<>("quantity"));

            //row factory to toggle a pseudoclass when the row has multipleChildren
            table.setRowFactory(t-> new TreeTableRow<Product>(){
                @Override
                public void updateItem(Product prod, boolean empty) {
                    super.updateItem(prod, empty);      
                    if(prod==null||empty) {
                        setText(null);
                        setGraphic(null);
                        pseudoClassStateChanged(PseudoClass.getPseudoClass("multipleChildren"), false);
                    }else {
                        boolean multipleChildren = getTreeItem().getChildren().size()>1;
                        pseudoClassStateChanged(PseudoClass.getPseudoClass("multipleChildren"), multipleChildren);
                    }
                }
            });

            table.getColumns().addAll(nameCol,quantityCol);
            return table;
        }
    }

## CSS ##

    .tree-table-row-cell:multipleChildren .tree-table-cell{
        -fx-font-size: 14;
        -fx-text-fill: grey;
        -fx-background-color:   lightGrey ;
    }
    .tree-table-row-cell:expanded:multipleChildren .tree-table-cell{
        -fx-text-fill: lightGrey;
        -fx-background-color:   lightGrey ;
        -fx-cell-size: 0.30em;
    }
    .tree-table-row-cell:expanded:multipleChildren{
        -fx-cell-size: 0.30em;
    }

## Model ##
    public class Product{
        private StringProperty name;
        private DoubleProperty quantity;

        public Product(String name, double quantity) {
            this.name = new SimpleStringProperty(name);
            this.quantity = new SimpleDoubleProperty(quantity);
        }

        public StringProperty nameProperty() {
            return name;
        }

        public DoubleProperty quantityProperty() {
            return quantity;
        }
    }

enter image description here

...