2016-06-08 56 views
1

我的問題是如何用我自己的Comparator創建一個treetableview(JavaFX8)。JavaFX - TreeTableView sortPolicyProperty()

我發現了一些例子,如JavaFX TableView Sort Policy,但它們都是TableView而不是TreeTableView

謝謝。

這裏是我的示例代碼:

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); 
    } 

} 
} 

回答

1

只需更換這...

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); 
} 

...這... ...

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

......它將工作(至少在你的問題TreeTableView)。

這是完全一樣的,在回答你剛纔提到:

您創建一個Comparator對對象的集合在你TreeTableView使用。唯一不同的是,您在不同的列表上使用此比較器:在鏈接答案中,它用於比較table.getItems(),並且我修改了這個以用於table.getRoot().getChildren()(根節點的子節點)。

注意,如果添加多個級別1 TreeItem,或者增加樹級別,則必須對其進行調整,但工作流程相同。

+0

是的,你是對的。如果有幾個級別,只需要爲排序添加一個循環。 - - - 很有幫助。有用。謝謝。 –