2016-05-30 11 views
1

Ich möchte die Auswahl in einem TreeView abrufen und das entsprechende Modellobjekt zurückgegeben haben. Alle Antworten darauf legen nahe, dass dies mit einem inneren Klassen- oder Lambda-Ausdruck geschieht. Allerdings erinnert mich dieser Compiler daran, dass Variablen (effektiv) endgültig sein müssen. Ich verstehe, warum das so ist, aber ich weiß nicht, das Problem zu lösen.JavaFX Treeview gibt ausgewählte Einträge zurück

Hinweis: Ich bin mir eigentlich nicht sicher, warum die Situation überhaupt einen Listener erfordern würde, da ich nicht einmal ständig zuhören möchte, sondern das Ergebnis bekomme, wenn die Methode aufgerufen wird.

private CampaignObject getLeadSelect(){ 
    CampaignObject co = null; 

    campTree.getSelectionModel().selectedItemProperty().addListener(
     new ChangeListener<TreeItem <CampaignObject>>() { 
      @Override 
      public void changed(ObservableValue<? extends TreeItem<CampaignObject>> observableValue, 
        TreeItem<CampaignObject> oldItem, TreeItem<CampaignObject> newItem) { 
        co = newItem.getValue()); 
     } 
    }); 

    return co; 
} 
+0

Ich bin verwirrt: Wenn Sie sagen, Sie brauchen keinen Zuhörer, warum definieren Sie einen? –

+0

In Ihrem Code fehlt ein "}" – LoicTheAztec

Antwort

3

Wenn Sie keinen Listener benötigen, definieren Sie keinen. Es klingt wie Sie nur

private CampaignObject getLeadSelect(){ 
    TreeItem<CampaignObject> selectedItem = campTree.getSelectionModel().getSelectedItem(); 
    return selectedItem == null ? null : selectedItem.getValue() ; 
} 

benötigen Wenn Sie mehrere Auswahl aktiviert und wollen eine Liste der Modellobjekte haben, die ausgewählt werden, tun

private List<CampaignObject> getAllSelected() { 
    return campTree.getSelectionModel().getSelectedItems() 
      .stream() 
      .map(TreeItem::getValue) 
      .collect(Collectors.toList()); 
} 

Wenn Sie das ausgewählte Element beobachten wollen als Modellobjekt, können Sie so etwas wie tun:

ObjectProperty<CampaignObject> selectedCampaign = new SimpleObjectProperty<>(); 
selectedCampaign.bind(Bindings.createObjectBinding(() -> { 
    TreeItem<CampaignObject> selectedItem = campTree.getSelectionModel().getSelectedItem(); 
    return selectedItem == null ? null : selectedItem.getValue(); 
}, campTree.getSelectionModel().selectedItemProperty())); 

und dann kann man Dinge wie

selectedCampaign.addListener((obs, oldCampaign, newCampaign) -> { 
    // ... 
});