看了之后James_D的e我找到了一种通过我正在寻找的功能实现该组的功能。这里是JavaFX中按功能分组的完整源代码。
public class Main extends Application {
List<Employee> employees = Arrays.<Employee>asList(
new Employee("Ethan Williams", "[email protected]", "A"),
new Employee("Emma Jones", "[email protected]", "B"),
new Employee("Michael Brown", "[email protected]", "A"),
new Employee("Anna Black", "[email protected]", "C"),
new Employee("Rodger York", "[email protected]", "B"),
new Employee("Susan Collins", "[email protected]", "A"));
final TreeItem<Employee> root =
new TreeItem<>(new Employee("Sales Department", "", ""), null);
Label dropLabel;
BreadCrumbBar breadcrum;
private Comparator<Employee> groupingComparator;
private ArrayList<String> comperatorList = new ArrayList<>();
Map<String, Function<Employee, Comparable>> gettersMap = new HashMap<>();
private TreeTableView<Employee> treeTableView;
@Override
public void start(Stage stage) throws Exception{
stage.setTitle("Tree Table View Sample");
final Scene scene = new Scene(new Group(), 400, 400);
scene.setFill(Color.LIGHTGRAY);
Group sceneRoot = (Group) scene.getRoot();
root.setExpanded(true);
employees.stream().forEach((employee) -> {
root.getChildren().add(new TreeItem<>(employee));
});
gettersMap.put("Employee", Employee::getName);
gettersMap.put("Email", Employee::getEmail);
gettersMap.put("Test", Employee::getTest);
TreeTableColumn<Employee, String> empColumn = column("Employee", Employee::getName);
empColumn.setPrefWidth(150);
empColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures<Employee, String> param) ->
new ReadOnlyStringWrapper(param.getValue().getValue().getName())
);
TreeTableColumn<Employee, String> emailColumn = column("Email", Employee::getEmail);
emailColumn.setPrefWidth(190);
emailColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures<Employee, String> param) ->
new ReadOnlyStringWrapper(param.getValue().getValue().getEmail())
);
TreeTableColumn<Employee, String> testColumn = column("Test", Employee::getTest);
testColumn.setPrefWidth(190);
testColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures<Employee, String> param) ->
new ReadOnlyStringWrapper(param.getValue().getValue().getTest())
);
treeTableView = new TreeTableView<Employee>(root);
treeTableView.getColumns().setAll(empColumn, emailColumn, testColumn);
breadcrum = new BreadCrumbBar<>();
breadcrum.setOnCrumbAction(new EventHandler<BreadCrumbBar.BreadCrumbActionEvent<String>>() {
@Override
public void handle(BreadCrumbBar.BreadCrumbActionEvent<String> event) {
}
});
dropLabel = new Label("Use the shift key when you select a column to group");
dropLabel.setOnDragOver(e -> {
if (groupingComparator != null && "Group".equals(e.getDragboard().getString())) {
e.acceptTransferModes(TransferMode.COPY);
}
});
dropLabel.setOnDragDropped(e -> {
if (groupingComparator != null && "Group".equals(e.getDragboard().getString())) {
comperatorList.add(((Label) e.getGestureSource()).getText());
String selectedColumn = ((Label)e.getGestureSource()).getText();
if(breadcrum.selectedCrumbProperty().get() == null) {
TreeItem<String> root = new TreeItem<String>(selectedColumn);
breadcrum.selectedCrumbProperty().set(root);
}
else
{
TreeItem<String> root = (TreeItem<String>) breadcrum.selectedCrumbProperty().get();
TreeItem<String> child = new TreeItem<String>(selectedColumn);
root.getChildren().add(child);
breadcrum.selectedCrumbProperty().set(child);
}
try {
String comperatorString = "";
for (String temp : comperatorList)
{
comperatorString += temp + ";";
}
comperatorString = comperatorString.substring(0, comperatorString.length()-1);
Comparator<Employee> comparator = getComparator(comperatorString);
ArrayList<Employee> allItems = new ArrayList<Employee>();
getChildren(root, allItems);
Collections.sort(allItems, comparator);
ArrayList<String> compareValues = new ArrayList<String>();
ArrayList<TreeItem<Employee>> parents = new ArrayList<TreeItem<Employee>>();
parents.add(0, this.root);
this.root.getChildren().removeAll(this.root.getChildren());
for(Employee item: allItems)
{
for(int i =0; i < comperatorList.size(); i++)
{
Method getMethod = item.getClass().getMethod("get" + this.comperatorList.get(i), null);
String result = (String) getMethod.invoke(item);
if((compareValues.size() <= i || !result.equals(compareValues.get(i))))
{
TreeItem<Employee> newItem = new TreeItem<Employee>(new Employee());
newItem.setExpanded(true);
parents.add(i+1, newItem);
parents.get(i).getChildren().add(newItem);
compareValues.add(i, result);
}
//Add leafs to tree
if(i == comperatorList.size() -1 || (i == 0 && comperatorList.size() == 0))
{
parents.get(i+1).getChildren().add(new TreeItem<Employee>(item));
}
}
}
treeTableView.setRoot(root);
}
catch (Exception ex)
{
System.out.print(ex.getStackTrace());
}
e.setDropCompleted(true);
}
});
VBox boxRoot = new VBox();
boxRoot.getChildren().add(dropLabel);
boxRoot.getChildren().add(breadcrum);
boxRoot.getChildren().add(treeTableView);
treeTableView.setShowRoot(false);
treeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
treeTableView.getSelectionModel().setCellSelectionEnabled(true);
sceneRoot.getChildren().add(boxRoot);
stage.setScene(scene);
stage.show();
}
public ArrayList<Employee> getChildren(TreeItem<Employee> root, ArrayList<Employee> allItems)
{
for(TreeItem<Employee> employeeItem :root.getChildren())
{
if(employeeItem.isLeaf())
{
allItems.add(employeeItem.getValue());
}
else
{
getChildren(employeeItem, allItems);
}
}
return allItems;
}
public Comparator<Employee> getComparator(String order){
String[] keys = order.split(";");
Comparator<Employee> result = Comparator.comparing(gettersMap.get(keys[0]));
for (int i = 1; i<keys.length; i++){
result = result.thenComparing(gettersMap.get(keys[i]));
}
return result;
}
private <T extends Comparable<T>> TreeTableColumn<Employee,T> column(String title, Function<Employee,T> property) {
TreeTableColumn<Employee,T> col = new TreeTableColumn<>();
//col.setCellValueFactory(cellData -> new SimpleObjectProperty<>(property.apply(cellData.getValue())));
Label graphic = new Label(title);
graphic.setOnDragDetected(e -> {
groupingComparator = Comparator.comparing(property);
Dragboard dragboard = graphic.startDragAndDrop(TransferMode.COPY);
ClipboardContent cc = new ClipboardContent();
cc.putString("Group");
dragboard.setContent(cc);
});
graphic.setOnDragDone(e -> {
groupingComparator = null ;
});
col.setGraphic(graphic);
return col ;
}
public static void main(String[] args) {
launch(args);
}
}
对于那些不熟悉nattable的人,你能更全面地解释它的功能吗? –
增加了一些更多细节描述。 – JimmyD