2014-12-30 40 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());