2014-12-30 43 views
2

我在我的應用程序中有一個ListView,我想排序條目。 我也希望列表自動排序,如果添加一個新的條目。JavaFX排序ListView

爲此,我使用SortedList。 Java API說:「ObservableList中的所有更改立即傳播到SortedList。」。

當我在下面運行我的代碼時,命令行的輸出正是我所期望的。 但是ListView沒有排序。

我該怎麼做?謝謝!

public class Test extends Application 
{ 
    public static final ObservableList names = FXCollections.observableArrayList(); 

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

    @Override 
    public void start(Stage primaryStage) { 
     final ListView listView = new ListView(names); 
     listView.setPrefSize(200, 250); 
     listView.setEditable(true); 

     names.addAll("Brenda", "Adam", "Williams", "Zach", "Connie", "Donny", "Lynne", "Rose", "Tony", "Derek"); 

     listView.setItems(names); 
     SortedList<String> sortedList = new SortedList(names); 
     sortedList.setComparator(new Comparator<String>(){ 
      @Override 
      public int compare(String arg0, String arg1) { 
       return arg0.compareToIgnoreCase(arg1); 
      } 
     }); 

     for(String s : sortedList) 
      System.out.println(s); 
     System.out.println(); 

     names.add("Foo"); 
     System.out.println("'Foo' added"); 
     for(String s : sortedList) 
      System.out.println(s); 

     StackPane root = new StackPane(); 
     root.getChildren().add(listView); 
     primaryStage.setScene(new Scene(root, 200, 250)); 
     primaryStage.show(); 
    } 
} 

命令行輸出:

Adam 
Brenda 
Connie 
Derek 
Donny 
Lynne 
Rose 
Tony 
Williams 
Zach 

'Foo' added 
Adam 
Brenda 
Connie 
Derek 
Donny 
Foo <-- 
Lynne 
Rose 
Tony 
Williams 
Zach 

回答

6

您需要在ListView使用SortedList。即做

final ListView listView = new ListView(); 
    listView.setPrefSize(200, 250); 
    listView.setEditable(true); 

    names.addAll("Brenda", "Adam", "Williams", "Zach", "Connie", "Donny", "Lynne", "Rose", "Tony", "Derek"); 

    SortedList<String> sortedList = new SortedList(names); 
    listView.setItems(sortedList); 
+0

哦見鬼去吧!我認爲這是行不通的,因爲我總是得到一個UnsupportedOperationException,因爲我向sortedList添加了新條目。 謝謝! –

1

對於Java 8:

listView.setItems(names.sorted());