2014-09-21 114 views
3

我有這個非常簡單的TreeView示例。按名稱排序TreeView

import javafx.application.Application; 
import javafx.beans.property.ReadOnlyStringWrapper; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.TreeTableColumn; 
import javafx.scene.control.TreeTableColumn.CellDataFeatures; 
import javafx.scene.control.TreeItem; 
import javafx.scene.control.TreeTableView; 
import javafx.stage.Stage; 

public class TreeTableViewSample extends Application { 

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

    @Override 
    public void start(Stage stage) { 
     stage.setTitle("Tree Table View Samples"); 
     final Scene scene = new Scene(new Group(), 200, 400); 
     Group sceneRoot = (Group)scene.getRoot(); 

     //Creating tree items 
     final TreeItem<String> childNode1 = new TreeItem<>("Child Node 1"); 
     final TreeItem<String> childNode2 = new TreeItem<>("Child Node 2"); 
     final TreeItem<String> childNode3 = new TreeItem<>("Child Node 3"); 

     //Creating the root element 
     final TreeItem<String> root = new TreeItem<>("Root node"); 
     root.setExpanded(true); 

     //Adding tree items to the root 
     root.getChildren().setAll(childNode1, childNode2, childNode3);   

     //Creating a column 
     TreeTableColumn<String,String> column = new TreeTableColumn<>("Column"); 
     column.setPrefWidth(150); 

     //Defining cell content 
     column.setCellValueFactory((CellDataFeatures<String, String> p) -> 
      new ReadOnlyStringWrapper(p.getValue().getValue())); 

     //Creating a tree table view 
     final TreeTableView<String> treeTableView = new TreeTableView<>(root); 
     treeTableView.getColumns().add(column); 
     treeTableView.setPrefWidth(152); 
     treeTableView.setShowRoot(true);    
     sceneRoot.getChildren().add(treeTableView); 
     stage.setScene(scene); 
     stage.show(); 
    }  
} 

我很感興趣我怎麼能按名稱排序樹節點?

此功能是否已經在JavaFX中實現或者我需要實現自定義樹單元格?

有沒有我可以用的例子?

回答

3

默認情況下,每個TableColumn上的項目只需點擊一次或兩次即可對其進行排序,以獲取默認排序順序(默認爲升序或降序)。

默認比較器是String.compareTo,它按字典順序比較兩個字符串。

但是你可以實現你自己的。舉例來說,這將由字符串的長度排序:

// compare by length of the strings 
column.setComparator(Comparator.comparing(String::length)); 

而這一次將首先按長度,然後在長度相等的情況下,通過名稱:

// compare by length first, and then lexicographically 
column.setComparator(Comparator.comparing(String::length).thenComparing(String::compareTo)); 

編輯:由於示例涉及到TreeTableView,但OP請求的是TreeView,因此這是項目如何排序的原因:

1)由於我們添加了一組項目,因此我們可以在將子項添加到第Ë根

@Override 
public void start(Stage stage) { 
    stage.setTitle("Tree Table View Samples"); 
    final Scene scene = new Scene(new Group(), 200, 400); 
    Group sceneRoot = (Group)scene.getRoot(); 

    //Creating tree items 
    final TreeItem<String> childNode1 = new TreeItem<>("Child Node 10"); 
    final TreeItem<String> childNode2 = new TreeItem<>("Child Node Two"); 
    final TreeItem<String> childNode3 = new TreeItem<>("Child Node 3"); 

    //Creating the root element 
    final TreeItem<String> root = new TreeItem<>("Root node"); 
    root.setExpanded(true); 

    List<TreeItem<String>> list = Arrays.asList(childNode1, childNode2, childNode3); 
    // sort by length of the item's names 
    list.sort(Comparator.comparing(t->t.getValue().length())); 

    //Adding tree items to the root 
    root.getChildren().setAll(list); 

    TreeView<String> tree = new TreeView<> (root);  

    sceneRoot.getChildren().add(tree); 
    stage.setScene(scene); 
    stage.show();   
} 

2)一旦我們添加的項目到根,我們可以提供一個Comparator到根:

@Override 
public void start(Stage stage) { 
    stage.setTitle("Tree Table View Samples"); 
    final Scene scene = new Scene(new Group(), 200, 400); 
    Group sceneRoot = (Group)scene.getRoot(); 

    //Creating tree items 
    final TreeItem<String> childNode1 = new TreeItem<>("Child Node 10"); 
    final TreeItem<String> childNode2 = new TreeItem<>("Child Node Two"); 
    final TreeItem<String> childNode3 = new TreeItem<>("Child Node 3"); 

    //Creating the root element 
    final TreeItem<String> root = new TreeItem<>("Root node"); 
    root.setExpanded(true); 

    //Adding tree items to the root 
    root.getChildren().setAll(childNode1, childNode2, childNode3); 

    TreeView<String> tree = new TreeView<> (root);  

    // sort by length of the item's names   
    root.getChildren().sort(Comparator.comparing(t->t.getValue().length())); 

    sceneRoot.getChildren().add(tree); 
    stage.setScene(scene); 
    stage.show();   
} 
+2

你能告訴我一些例子爲TreeView控件? – user1285928 2014-09-21 21:24:50

+0

非常感謝。 – chris 2015-04-27 19:16:40