2016-06-27 5 views
1

У меня есть Combo, заполненный с помощью ObservableMap<String, Member>. Я хочу, если элемент (ключ) выбран в комбо, чтобы получить соответствующий объект (значение). Это то, что я до сих порCombo with ObservableMap Binding

import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.HashMap; 
import java.util.logging.Level; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.collections.ObservableMap; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 
import org.controlsfx.control.textfield.TextFields; 

public class ComboWithHashMap extends Application{ 
    private ComboBox autocompleteCombo = new ComboBox(); 
    private ObservableMap<String, Member> list; 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     primaryStage.setTitle("Combo Sample"); 
     primaryStage.setWidth(450); 
     primaryStage.setHeight(550); 

     list = FXCollections.observableMap(getActiveMember()); 
     autocompleteCombo.getItems().setAll(list.keySet()); 
     //TextFields.bindAutoCompletion(autocompleteCombo.getEditor(), autocompleteCombo.getItems()); 
     Scene scene = new Scene(new BorderPane(autocompleteCombo), 880, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 


    public HashMap<String, Member> getActiveMember(){ 
     HashMap<String, Member> map = new HashMap<String, Member>(); 
     Member member1 = new Member(1, "123", "John Doe"); 
     Member member2 = new Member(2, "234", "Sally Doe"); 
     Member member3 = new Member(3, "345", "Billy Doe"); 
     Member member4 = new Member(4, "567", "Mac Doe"); 
     Member member5 = new Member(5, "789", "Win Doe"); 

     map.put(member1.getMilkNo(), member1); 
     map.put(member2.getMilkNo(), member2); 
     map.put(member3.getMilkNo(), member3); 

     return map; 
    } 

    public class Member { 
     private int id; 
     private String milkNo; 
     private String fullName; 

     public Member(int id, String milkNo, String fullName) { 
      this.id = id; 
      this.milkNo = milkNo; 
      this.fullName = fullName; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 


     public String getMilkNo() { 
      return milkNo; 
     } 

     public void setMilkNo(String milkNo) { 
      this.milkNo = milkNo; 
     } 

     @Override 
     public String toString() { 
      return fullName; 
     } 

    } 

} 

Проблема в том, до сих пор я не могу получить соответствующий объект (значение) при выборе клавиши.

ответ

1

Получить значение объекта, соответствующее строке в combobox value property listener. Код такой, как показано.

autocompleteCombo.valueProperty().addListener(new ChangeListener() { 

    @Override 
    public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
     Member member = (Member) list.get(newValue); 
     System.out.println(member.getId()); 
     System.out.println(member.getMilkNo()); 
     System.out.println(member.getFullName()); 
    } 
}); 
1

valueAt method of Bindings создает привязку к в ObservableMap дали карту и ключ:

ObjectBinding<Member> value = Bindings.valueAt(list, autocompleteCombo.valueProperty()); 

Обратите внимание, что в то время как эта привязка будет обновляться если ObservableMap изменений, элементы вашего ComboBox останутся без изменений. Если вы удалите ключ с карты, связывание будет содержать , однако ваш ComboBox все равно будет содержать элемент для этого ключа ...

+0

Как я могу получить выделенный объект, соответствующий этому объекту? –

+0

['value.get()'] (https://docs.oracle.com/javase/8/javafx/api/javafx/beans/binding/ObjectBinding.html#get--) (возможно, в сочетании с добавленным слушателем на 'значение', чтобы получать уведомления об обновлениях ...) – fabian

+0

Можно использовать, пожалуйста, укажите комбинацию кода? Связывание с ответом с помощью слушателя inorder для получения выбранного объекта соответствующего объекта –