2016-06-08 1 views
1

Ma question est comment créer un treetableview (JavaFX8) avec le mien Comparator. J'ai trouvé quelques exemples comme JavaFX TableView Sort Policy mais ils sont tous TableView pas TreeTableView.JavaFX - TreeTableView sortPolicyProperty()

Merci.

Voici mon code exemple:

import java.util.Comparator; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.beans.property.ReadOnlyObjectWrapper; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Insets; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.TreeItem; 
import javafx.scene.control.TreeTableColumn; 
import javafx.scene.control.TreeTableView; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Font; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class TableViewSampleWithoutEdit extends Application { 
    private TreeTableView<Person> table = new TreeTableView<Person>(); 
    private ExtraPerson extraPerson = new ExtraPerson("Ninja Village"); 
    TreeItem root = new TreeItem<>("root"); 
    private final ObservableList<TreeItem<Person>> data = FXCollections 
     .observableArrayList(
       new TreeItem<Person>(new Person("Jacob", "Smith", "[email protected]")), 
       new TreeItem<Person>(new Person("Isabella", "Johnson","[email protected]")), 
       new TreeItem<Person>(new Person("Ethan", "Williams","[email protected]")), 
       new TreeItem<Person>( new Person("Emma", "Jones", "[email protected]")), 
       new TreeItem<Person>(new Person("Michael", "Brown", "[email protected]")), 
       new TreeItem<Person>(extraPerson)); 

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

@Override 
public void start(Stage stage) { 
    Scene scene = new Scene(new Group()); 
    stage.setTitle("Table View Sample"); 
    stage.setWidth(450); 
    stage.setHeight(500); 

    final Label label = new Label("Address Book"); 
    label.setFont(new Font("Arial", 20)); 

    table.setEditable(true); 
    Platform.runLater(() -> { 
    TreeTableColumn<Person, String> firstNameCol = new TreeTableColumn("First Name"); 
    firstNameCol.setMinWidth(100); 
    firstNameCol.setCellValueFactory(cellData -> { 

     if (cellData.getValue().getValue()instanceof Person) { 
      return new ReadOnlyObjectWrapper(cellData.getValue().getValue().getFirstName()); 

     } 
     return new ReadOnlyObjectWrapper(cellData.getValue().getValue()); 
    }); 
    TreeTableColumn<Person, String> lastNameCol = new TreeTableColumn("Last Name"); 
    lastNameCol.setMinWidth(100); 
    lastNameCol.setCellValueFactory(cellData -> { 
     if (cellData.getValue().getValue()instanceof Person) { 

      return new ReadOnlyObjectWrapper(cellData.getValue().getValue().getLastName()); 

     } 
     return new ReadOnlyObjectWrapper(cellData.getValue().getValue()); 
    });  

    /** 
    * Adding comparator to extraPerson 
    */ 

    table.sortPolicyProperty().set(
      new Callback<TreeTableView<Person>, Boolean>() { 

       @Override 
       public Boolean call(final TreeTableView<Person> param) { 
        Comparator<TreeItem<Person>> comparator = new Comparator<TreeItem<Person>>() { 
         @Override 
         public int compare(TreeItem<Person> r1, TreeItem<Person> r2) { 
          if (r1.getValue() == extraPerson) { 
           return 1; 
          } else if (r2.getValue() == extraPerson) { 
           return -1; 
          } else if (param.getComparator() == null) { 
           return 0; 
          } else {System.out.println("c"); 
           return param.getComparator() 
             .compare(r1, r2); 
          } 
         } 
        }; 
        ObservableList<TreeItem<Person>> tables = FXCollections.observableArrayList(); 
        for (int i = 0; i < table.getExpandedItemCount(); i++) { 
         tables.add(table.getTreeItem(0)); 
        } 

        FXCollections.sort(tables,comparator); 
        if (tables.size()>0) { 
         table.getRoot().getChildren().setAll(tables); 
        } 

        return true; 
       } 

      }); 
    root.getChildren().setAll(data); 
    table.setRoot(root); 
    table.getColumns().addAll(firstNameCol, lastNameCol); 
    root.setExpanded(true); 
    final VBox vbox = new VBox(); 
    vbox.setSpacing(5); 
    vbox.setPadding(new Insets(10, 0, 0, 10)); 
    vbox.getChildren().addAll(label, table); 

    ((Group) scene.getRoot()).getChildren().addAll(vbox); 

    stage.setScene(scene); 
    stage.show(); 
} 

public static class Person { 

    private final SimpleStringProperty firstName; 
    private final SimpleStringProperty lastName; 
    private final SimpleStringProperty email; 

    private Person(String fName, String lName, String email) { 
     this.firstName = new SimpleStringProperty(fName); 
     this.lastName = new SimpleStringProperty(lName); 
     this.email = new SimpleStringProperty(email); 
    } 

    public String getFirstName() { 
     return firstName.get(); 
    } 

    public void setFirstName(String fName) { 
     firstName.set(fName); 
    } 

    public String getLastName() { 
     return lastName.get(); 
    } 

    public void setLastName(String fName) { 
     lastName.set(fName); 
    } 

    public String getEmail() { 
     return email.get(); 
    } 

    public void setEmail(String fName) { 
     email.set(fName); 
    } 
} 

public static class ExtraPerson extends Person { 

    private final SimpleStringProperty address; 

    private ExtraPerson(String address) { 
     super("Itachi", "Uchiha", "[email protected]"); 
     this.address = new SimpleStringProperty(address); 
    } 

    public String getAddress() { 
     return address.get(); 
    } 

    public void setAddress(String address) { 
     this.address.set(address); 
    } 

} 
} 

Répondre

1

Il suffit de remplacer cette ...

ObservableList<TreeItem<Person>> tables = FXCollections.observableArrayList(); 
for (int i = 0; i < table.getExpandedItemCount(); i++) { 
    tables.add(table.getTreeItem(0)); 
} 

FXCollections.sort(tables,comparator); 
if (tables.size()>0) { 
    table.getRoot().getChildren().setAll(tables); 
} 

... ce ...

if(table.getRoot() != null) 
    FXCollections.sort(table.getRoot().getChildren(), comparator); 

... et travaillera (au moins pour le TreeTableView dans votre question).

Il est exactement la même que dans la réponse que vous avez dit:

Vous créez un Comparator à utiliser sur une collection d'objets dans votre TreeTableView. La seule différence que vous utilisez ce comparateur sur différentes listes: dans la réponse liée, il est utilisé pour comparer table.getItems() et j'ai modifié cela pour être utilisé sur table.getRoot().getChildren() (nœuds enfants du nœud racine).

Notez que si vous ajoutez plusieurs niveaux1 TreeItem, ou si vous augmentez le niveau d'arborescence, vous devez l'adapter, mais le flux de travail est le même.

+0

Oui, vous avez raison. S'il y a plusieurs niveaux, il suffit d'ajouter une boucle pour le tri. ----- Très utile. Ça marche. Merci. –