Meu objetivo é adicionar um recurso ao existente TreeTableView
onde clicar no nó de divulgação de um grupo com Alta tecla pressionada deve expandir apenas o grupo associado, mas com todos os seus filhos (subgrupos) recolhidos, independentemente de terem sido expandidos anteriormente.
Sem que a Alttecla seja mantida pressionada, o nó de divulgação deve apenas acionar o comportamento "padrão".
Por exemplo, vamos supor que o usuário tenha a seguinte hierarquia de nós:
ROOT
-> GROUP_1
----> GROUP_1_1
--------> CHILD_1_1_1
--------> CHILD_1_1_2
--------> CHILD_1_1_3
----> GROUP_1_2
--------> CHILD_1_2_1
--------> CHILD_1_2_2
-> GROUP_2
-> GROUP_3
-> ...
Quando o usuário mantém pressionada a Alttecla e clica no nó de divulgação ao lado ROOT
para expandi-lo, espera-se que o sistema mostre. É essencial que os grupos GROUP_1_1
e GROUP_1_2
sejam recolhidos.
ROOT
-> GROUP_1
-> GROUP_2
-> GROUP_3
-> ...
A diferença entre esse comportamento e o padrão é que se o usuário mantiver a Alttecla pressionada e clicar no nó de divulgação ao lado, ROOT
o sistema deverá garantir que tudo dentro dele seja recolhido no final.
Estou procurando funções como CellBehaviorBase#doSelect
e TreeTableCellBehavior#handleDisclosureNode
, mas até agora não consegui encontrar nenhuma dica de como conseguir o que quero.
Exemplo mínimo para meus testes. O objetivo é ter a possibilidade de expandir o grupo raiz ("Carros") com todos os subgrupos recolhidos quando ALT
pressionado:
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) {
Pane rootNode = new VBox();
Scene scene = new Scene(rootNode, 400, 300);
stage.setTitle("TreeTableView Demo");
stage.setScene(scene);
TreeTableView<Car> treeTableView = new TreeTableView<>();
TreeTableColumn<Car, String> treeTableColumn1 = new TreeTableColumn<>("Brand");
treeTableColumn1.setPrefWidth(120);
TreeTableColumn<Car, String> treeTableColumn2 = new TreeTableColumn<>("Model");
treeTableColumn2.setPrefWidth(120);
treeTableColumn1.setCellValueFactory(param -> param.getValue().getValue().brandProperty());
treeTableColumn2.setCellValueFactory(param -> param.getValue().getValue().modelProperty());
treeTableView.getColumns().add(treeTableColumn1);
treeTableView.getColumns().add(treeTableColumn2);
TreeItem<Car> mercedes1 = new TreeItem<>(new Car("Mercedes", "SL500"));
TreeItem<Car> mercedes2 = new TreeItem<>(new Car("Mercedes", "SL500 AMG"));
TreeItem<Car> mercedes3 = new TreeItem<>(new Car("Mercedes", "CLA 200"));
TreeItem<Car> mercedes = new TreeItem<>(new Car("Mercedes", "..."));
mercedes.getChildren().add(mercedes1);
mercedes.getChildren().add(mercedes2);
TreeItem<Car> audi1 = new TreeItem<>(new Car("Audi", "A1"));
TreeItem<Car> audi2 = new TreeItem<>(new Car("Audi", "A5"));
TreeItem<Car> audi3 = new TreeItem<>(new Car("Audi", "A7"));
TreeItem<Car> audi = new TreeItem<>(new Car("Audi", "..."));
audi.getChildren().add(audi1);
audi.getChildren().add(audi2);
audi.getChildren().add(audi3);
TreeItem<Car> cars = new TreeItem<>(new Car("Cars", "..."));
cars.getChildren().add(audi);
cars.getChildren().add(mercedes);
treeTableView.setRoot(cars);
rootNode.getChildren().add(treeTableView);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
class Car {
private StringProperty brand = new SimpleStringProperty();
private StringProperty model = new SimpleStringProperty();
public Car(String brand, String model) {
this.brand.set(brand);
this.model.set(model);
}
public String getBrand() {
return brand.get();
}
public StringProperty brandProperty() {
return brand;
}
public void setBrand(String brand) {
this.brand.set(brand);
}
public String getModel() {
return model.get();
}
public StringProperty modelProperty() {
return model;
}
public void setModel(String model) {
this.model.set(model);
}
}