2015-08-07 2 views
0

Приложение hava JavaFX, которое показывает все папки определенного каталога и наблюдает за новыми/удаленными папками и обновляет ListView.Фильтр JavaFX ListView Элементы файла с использованием FileFilter

Теперь я пытаюсь разрешить пользователю фильтровать/искать папки с помощью TextField.
Я сделал это раньше, так что это соответствующий код:

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    // configure other stuff 
    configureListView(); 
} 

private void configureListView() { 
    searchField.textProperty().addListener((observable, oldVal, newVal) -> { 
     handleSearchOnType(observable, oldVal, newVal); 
    }); 
    // more stuff here 
} 

private void handleSearchOnType(ObservableValue observable, String oldVal, String newVal) { 
    File folderToSearch = new File(config.getDlRootPath()); 
    ObservableList<File> filteredList = FXCollections.observableArrayList(folderToSearch.listFiles(
      pathname -> pathname.isDirectory() && pathname.getName().contains(newVal))); // something seems wrong here?! 
    if (!searchField.getText().isEmpty()) { 
     listView.setItems(filteredList); 
    } else { 
     // nothing to filter 
     listView.setItems(FXCollections.observableArrayList(
      folderToSearch.listFiles(pathname -> pathname.isDirectory()))); 
     } 
    } 

Это дает мне странные результаты, например .:

no search search for 'test'

Что я здесь отсутствует?

Спасибо заранее!

Edit:

Мой заказ клетка завод

listView.setCellFactory(new Callback<ListView<File>, ListCell<File>>() { 
      @Override 
      public ListCell<File> call(ListView<File> list) { 
       return new ListCell<File>() { 
        @Override 
        protected void updateItem(File t, boolean bln) { 
         super.updateItem(t, bln); 
         if (t != null) { 
          setGraphic(new ImageView(new Image("img/folder.png"))); 
          setText(t.getName()); 
         } 
        } 

       }; 
      } 
     }); 
+0

Вместо проверки '! SearchField .getText(). isEmpty() 'вы можете попробовать'! oldVal.isEmpty() '? – Mustafa

+0

Не исправить, ничего не изменилось. – lenny

+0

Случайное предположение: есть ли у вас обычная фабрика ячеек? Если да, можете ли вы опубликовать его? (Моя догадка, что вы неправильно обрабатываете пустые ячейки ...). (В стороне, вы потенциально получите лучшую производительность, просто сохраняя ссылку на отфильтрованный список и обновляя его предикат, вместо создания нового списка.) –

ответ

2

Не уверен, если это единственное, что неправильно, но пользовательский клетка завод должен обрабатывать случай, когда ячейка пуста:

final Image image = new Image("img/folder.png"); 

listView.setCellFactory(new Callback<ListView<File>, ListCell<File>>() { 
    @Override 
    public ListCell<File> call(ListView<File> list) { 
     return new ListCell<File>() { 
      private final ImageView imageView = new ImageView(image); 
      @Override 
      protected void updateItem(File t, boolean bln) { 
       super.updateItem(t, bln); 
       if (t == null) { 
        setGraphic(null); 
        setText(null); 
       } else { 
        setGraphic(imageView); 
        setText(t.getName()); 
       } 
      } 

     }; 
    } 
}); 

Дело в том, что при запуске фильтрации некоторые ячейки, которые ранее не были пустыми, станут пустыми. updateItem(null, true) будет вызываться на этих ячейках, которые затем должны очистить все их содержимое (в противном случае они просто сохраняют содержимое, которое у них было до этого).

(Для бонуса, я также немного переработан так, что вы не держите загрузки изображения из файла изображения в каждой клетке, каждый раз, когда пользователь прокручивает вид списка.)

+0

Отлично! Это была единственная проблема, теперь она работает так, как должна. благодаря – lenny