2017-06-02 3 views
2

J'ai un TableView avec deux colonnes nommées Produit et Marque. Un produit peut être de différentes marques. Par exemple. La télévision a différentes marques comme Samsung, Sony, etc. Je montre des marques d'un produit dans ComboBoxes.Ajout dynamique de valeurs à javafx ComboBoxTableCell sélectionné

Voici comment j'ajoute un ComboBoxTableCell pour ma colonne de marque.

ObservableList<String> catList = FXCollections.observableArrayList(); 

    categoryCol.setCellFactory(t -> { 
     ComboBoxTableCell comboCell = new ComboBoxTableCell(catList); 
     return comboCell; 
    }); 
    contactTable.getColumns().add(categoryCol); 

Maintenant, dans ces ComboBox, je veux ajouter des valeurs de marques. Comme il y aura des produits différents, leurs marques seront également différentes. Par exemple.

Product | Model 
---------------------------------------------- 
TV  | ComboBox[Samsung, Sony, Panasonic] 
Monitor | ComboBox[Dell, Microsoft, Apple ] 

Maintenant, puisque les ComboBoxes ont même modèle de données (ObservableList) Comment puis-je ajouter des valeurs différentes pour les en sélectionnant les éléments dans le tableau. Est-il possible de faire? Merci d'avance pour votre aide.

Répondre

1

tout d'abord vous avez besoin d'une classe de ligne personnalisée dans laquelle vous stockez les éléments, alors vous devez @Override le startEdit() du ComboBoxTreeTableCell par exemple ainsi:

@Override public void startEdit() { 
    MyCustomRow currentRow = getTableRow().getItem(); 
    getItems().setAll(currentRow.getModels()); 
     super.startEdit(); 
    } 
} 

MyCustomRow:

package mypackage; 

import javafx.beans.property.SimpleStringProperty; 

import java.util.List; 
import java.util.Map; 

public class MyCustomRow { 

    private SimpleStringProperty product; 

    private SimpleStringProperty model; 

    private List<String> allModels; 

    public MyCustomRow(
      String product, 
      String model, 
      List<String> models) { 
     this.product = new SimpleStringProperty(product); 
     this.model = new SimpleStringProperty(product); 
     this.allModels = models; 
    } 

    public String getProduct() { 
     return product.get(); 
    } 

    public SimpleStringProperty productProperty() { 
     return product; 
    } 

    public String getModel() { 
     return model.get(); 
    } 

    public SimpleStringProperty modelProperty() { 
     return model; 
    } 

    public List<String> getModels() { 
     return allModels; 
    } 
} 

Ensuite, dans votre classe de contrôleur, vous pouvez dire:

ObservableList<String> carList = FXCollections.observableArrayList(); 

    categoryCol.setCellFactory(t -> new ComboBoxTableCell(carList){ 
     @Override public void startEdit() { 
      MyCustomRow currentRow = getTableRow().getItem(); 
      getItems().setAll(currentRow.getModels()); 
      super.startEdit(); 
     } 
    }); 
    categoryCol.setCellValueFactory(v -> v.getValue().modelProperty()); 
    contactTable.getColumns().add(categoryCol); 

Donc, chaque ligne vous ajoutez les modèles appropriés. Donc, dans le ComboBox, vous aurez uniquement les articles (modèles) qui appartiennent au produit