2015-12-02 7 views
1

Я использую CharmListView и только что заметил, что у него нет SelectionModel, что и в ListView. Я использовал listView.getSelectionModel().SelectedItemProperty().addListener() для ответа на событие выбора элемента с помощью ListView. Как это делается с CharmListView?CharmListView SelectedItemProperty?

EDIT

Поток приложения поясняется ниже:

Пользователь выбирает отделение школы. Этот список находится в ListView

enter image description here

затем семестр. Этот другой список в CharmListView:

enter image description here

initialize метод SemesterPresenter класса:

public void initialize(URL url, ResourceBundle rb) { 
    loadSemesters(); 
    semesterListView.setItems(semesters); 
    semesterListView.setHeadersFunction(Level::getLevel); 
    MobileApplication.getInstance().getView().showingProperty().addListener((obs,ov,nv)->{ 
     System.out.println(semesterListView.getChildrenUnmodifiable()); 
    }); 
} 

Первый вызов getChildrenUnmodifiable() возвращает пустой массив. Это тот же сценарий при использовании всех предложений в posts below с возвращенными нулевыми указателями.

ответ

1

На данный момент несколько свойств внутреннего управления ListView не отображаются, например, selectionModel или focusModel. Это могут быть входящие релизы.

В настоящем время, в качестве обходного пути вы можете поиск для него:

CharmListView<?, ?> charmListView = new CharmListView<>(); 
... 
stage.show(); 
... 
ListView innerList = (ListView)charmListView.lookup(".list-view"); 
innerList.getSelectionModel().selectedItemProperty().addListener(
    (obs, ov, nv) -> System.out.println("Selected: " + nv)); 

issue был подан с этой просьбой.

EDIT

на основе новой информации, предоставленной ОП, сразу после CharmListView инициализации, управления создается, но он не создал свою кожу еще, так что список детей пуст в данный момент.

Добавление Platform.runLater(); просто задерживает извлечение этого списка количества времени, необходимого для полного создания скина.

Это должно работать:

@FXML 
private CharmListView<String, String> charmListView; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    charmListView.setItems(FXCollections.observableArrayList("This", "is", "a", "test")); 

    Platform.runLater(() -> { 
     for (Node node : charmListView.getChildrenUnmodifiable()) { 
      if (node instanceof ListView) { 
       ((ListView)node).getSelectionModel().selectedItemProperty().addListener(
         (obs, ov, nv) -> System.out.println(nv)); 
      } 
     } 
    }); 
} 

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

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    charmListView.setItems(FXCollections.observableArrayList("This", "is", "a", "test")); 
    charmListView.skinProperty().addListener((obs, ov, nv) -> { 
     for (Node node : charmListView.getChildrenUnmodifiable()) { 
      if (node instanceof ListView) { 
       ((ListView)node).getSelectionModel().selectedItemProperty().addListener(
         (obs2, ov2, nv2) -> System.out.println(nv2)); 
      } 
     } 
    }); 
} 
+0

I получить исключение нулевого указателя для поиска. Когда эта страница отображается в приложении MobileApplication? – theking

+1

Попробуйте 'Platform.runLater (() -> {ListView innerList ...});' в методе 'postInit (Scene scene)', который вызывается непосредственно перед показом сцены. –

+0

Это решает проблему в приложении FiftyStates. В моем проекте мне нужно вызвать его в презентаторе, который содержит CharmListView. Как мне это сделать? – theking

 Смежные вопросы

  • Нет связанных вопросов^_^