2016-03-02 147 views
0

我需要一個combobox填充通過observablelist包含從數據庫中檢索的特定數據。這是我的來源。JAVAFX 8 ComboBox和ObservableList

型號

public ObservableList<Bank> listBank = FXCollections.observableArrayList(); 

public static class Bank { 
      private final StringProperty id; 
      private final StringProperty name; 

      private Bank(
        String id, 
        String name 
      ) { 
      this.id = new SimpleStringProperty(id); 
      this.name = new SimpleStringProperty(name);   
      } 

      public StringProperty idProperty() { return id; } 
      public StringProperty nameProperty() { return name; }   
     } 

查看

@FXML 
private ComboBox comboBank<Bank>; 

public final void getBankDataFields() { 
     comboBank.setItems(model.listBank); 
    } 

comboBank.setButtonCell(new ListCell<Bank>() { 
       @Override 
       protected void updateItem(Bank t, boolean bln) { 
        super.updateItem(t, bln); 
        if (t != null) { 
         setText(t.nameProperty().getValue().toUpperCase()); 
        } else { 
         setText(null); 
        } 
       } 
      }); 

comboBank.setCellFactory(new Callback<ListView<Bank>, ListCell<Bank>>() { 
       @Override 
       public ListCell<Bank> call(ListView<Bank> p) { 
        return new ListCell<Bank>() { 
         @Override 
         protected void updateItem(Bank t, boolean bln) { 
          super.updateItem(t, bln); 
          if(t != null){ 
           setText(t.nomeProperty().getValue().toUpperCase()); 
          } else { 
           setText(null); 
          }  

         }      
        }; 
       } 
      }); 

comboBank.valueProperty().addListener((ObservableValue<? extends Bank> observable, Bank oldValue, Bank newValue) -> { 
       setIdBank(newValue.idProperty().getValue()); 
      }); 

組合框填充與NAME場和監聽來獲取相對ID並把它傳遞給查詢存儲在數據庫的數據。

好,似乎一切工作,但我有兩個問題:

  1. 當用戶需要修改這個記錄,我需要從數據庫的ID和組合框選擇相對名稱。我怎樣才能做到這一點?

    comboBank.setValue(????);

  2. 有沒有更好的方法來達到這個目標? ObservableMap可能替代ObservableList?

在此先感謝。

+0

你應該只使用一個'StringConverter'你的組合框。 – ItachiUchiha

回答

2

有一個更簡單的方法,你正試圖實現。您應該在組合框上使用StringConverter來顯示銀行實例的名稱。

comboBox.setConverter(new StringConverter<Bank>() { 

    @Override 
    public String toString(Bank object) { 
     return object.nameProperty().get(); 
    } 

    @Override 
    public Bank fromString(String string) { 
     // Somehow pass id and return bank instance 
     // If not important, just return null 
     return null; 
    } 
}); 

若要選擇該選擇銀行的價值即實例,只需使用:

comboBox.getValue(); 

MCVE

import javafx.animation.PauseTransition; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.Duration; 
import javafx.util.StringConverter; 

import java.util.stream.Collectors; 

public class Main extends Application { 

    @Override 
    public void start(Stage stage) { 

     ComboBox<Bank> comboBox = new ComboBox<>(); 
     ObservableList<Bank> items = FXCollections.observableArrayList(
       new Bank("1", "A"), new Bank("2", "B"), 
       new Bank("3", "C"), new Bank("4", "D")); 
     comboBox.setItems(items); 
     StringConverter<Bank> converter = new StringConverter<Bank>() { 
      @Override 
      public String toString(Bank bank) { 
       return bank.nameProperty().get(); 
      } 

      @Override 
      public Bank fromString(String id) { 
       return items.stream() 
         .filter(item -> item.idProperty().get().equals(id)) 
         .collect(Collectors.toList()).get(0); 
      } 
     }; 
     comboBox.setConverter(converter); 
     // Print the name of the Bank that is selected 
     comboBox.getSelectionModel().selectedItemProperty().addListener((o, ol, nw) -> { 
      System.out.println(comboBox.getValue().nameProperty().get()); 
     }); 
     // Wait for 3 seconds and select the item with id = 2 
     PauseTransition pauseTransition = new PauseTransition(Duration.seconds(3)); 
     pauseTransition.setOnFinished(event -> comboBox.getSelectionModel().select(converter.fromString("2"))); 
     pauseTransition.play(); 
     VBox root = new VBox(comboBox); 
     root.setAlignment(Pos.CENTER); 
     Scene scene = new Scene(root, 200, 200); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 
+0

感謝您的評論Itachi,但我不知道如何使用它。我首先需要的是從存儲在數據庫中的相對ID開始以編程方式選擇一個組合框(顯示名稱)的項目。您的代碼是否有用於實現此功能? – Andrea

+0

@Andrea我已經添加了一個MCVE的答案,希望它可以幫助:) – ItachiUchiha

+0

非常感謝Itachi,你的貢獻我已經解決了這個問題。歡呼聲,並再次感謝謝謝:) – Andrea