JavaFX 8 Personnalisé ListView Cellules c'est le Mal
J'ai personnalisé ListView cellule j'ai HBox avec deux contrôles:
- Étiquette avec nom de domaine
- Il doit généré à partir du contexte de l'objet
Par exemple, j'ai défini les éléments ListView tableau des Champs de la Classe, si le champ de type Booléen je créer Case, si la Chaîne que je créer TextField et etc.
Problème est: je reçois l'objet de Champ seulement dans la méthode updateItem() - et seulement là, je peux créer mes contrôles.
En JavaFX 7 tout fonctionne bien, mais sur Java 8 - je ne vois pas mes contrôles.
Existe de façon correcte à résoudre mon cas?
Mise à JOUR de 1
Ici l'exemple complet pour reproduire le problème:
package javafx8listviewexample;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.Date;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.DatePicker;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.TextFieldListCell;
import javafx.util.Callback;
/**
*
* @author dmitrynelepov
*/
public class FXMLDocumentController implements Initializable {
static class TestClassForListView {
public String fieldString;
public Date fieldDate;
}
static class MyListCell extends ListCell<Field> {
/**
* As in tutorial
*
* @param t
* @param bln
*/
@Override
protected void updateItem(Field t, boolean bln) {
super.updateItem(t, bln);
if (t != null) {
if (t.getType().equals(String.class)) {
System.out.println("Draw string");
setGraphic(new TextField(t.getName()));
} else if (t.getType().equals(Date.class)) {
System.out.println("Draw Date");
setGraphic(new DatePicker());
}
}
}
}
@FXML
private ListView<Field> listView;
@FXML
private void handleButtonAction(ActionEvent event) {
this.listView.getItems().clear();
this.listView.setItems(
FXCollections.observableArrayList(
TestClassForListView.class.getFields()
)
);
}
@Override
public void initialize(URL url, ResourceBundle rb) {
this.listView.setCellFactory(new Callback<ListView<Field>, ListCell<Field>>() {
@Override
public ListCell<Field> call(ListView<Field> p) {
return new MyListCell();
}
});
}
}
Ici capture d'écran du programme de JDK 7
comme vous pouvez le voir, je TextField capable de se concentrer et d'édition.
Mais si je lance cet exemple avec le JDK 8 j'ai eu
comme ici u peut voir TextField ne peut pas être concentré et édité.
Alors que la question est très utile, pourriez-vous s'il vous plaît mettre à jour le titre? Il doit refléter avec plus de précision ce que vous trouvez si mal à propos de custom ListCell objets dans javafx8.
OriginalL'auteur Dmitry Nelepov | 2013-11-14
Vous devez vous connecter pour publier un commentaire.
Dirait que vous voulez un ControlsFX PropertySheet:
Une semblable mise en œuvre, est dans la réponse à la JavaFX 2 TableView : les différentes cellules de l'usine en fonction des données à l'intérieur de la cellule. Même si la réponse à cette question est basée sur TableView, à la fois ListView et TableView virtualisé contrôles, de sorte que la mise en œuvre du concept est quelque peu similaire à l'aide d'une ListView avec une HBox comme indiqué dans votre question.
Mise à jour basé sur un exemple de code à partir de la question.
Je pense tout de même qu'un ControlsFX PropertySheet semble être la solution la plus appropriée pour ce que vous essayez d'accomplir. À l'aide d'un Virtualisé de Contrôle comme une ListView pour une telle tâche simplement rend les choses plus compliquées qu'elles ne devraient l'être.
Une solution complète pour un ListView en fonction de la propriété de l'éditeur est une jolie chose complexe et hors de la portée de ce qui peut raisonnablement être fournies dans un StackOverflow réponse.
L'exemple de code que vous fournissez dans votre question a certaines questions. La liste est virtualisé de contrôle de sorte que vous ne devrait pas créer un nouveau graphique des nœuds de place à l'intérieur de la liste de tous les temps que la mise à jour est appelé. Ce qui se passe est qu'un TextField obtient le focus, puis mise à jour est appelé sur la liste et que vous créez un nouveau Champ et par défaut, le nouveau Champ n'a pas le focus.
Je pense que la liste elle-même a certains problèmes de mise en œuvre de votre cas particulier et demande de mise à jour trop souvent. Indépendamment de cela, vous devez écrire votre code, de sorte que vous pouvez traiter correctement mise à jour appelée à plusieurs reprises sur une seule cellule et. si vous le faites, il ne sera pas si ListView appelle la méthode plus de fois qu'elle en a besoin.
Voici un exemple de code qui peuvent vous aider à faire plus de progrès. Je ne crois pas que l'exemple de code est une solution complète pour répondre à votre question, il n'est certainement pas fourni comme un complet éditeur de propriétés pour les objets Java, mais peut-être cela peut vous donner un peu d'inspiration pour aider à améliorer et à mettre en œuvre votre code (en supposant que vous décidez de continuer à tenter de résoudre ce problème de cette manière). Si vous continuez à utiliser ListView, vous voudrez peut-être chercher dans l'édition des routines pour la ListView (similaire à ce qui est défini pour l'édition des cellules de tableau dans l'Oracle de JavaFX tutoriels).
Merci de poster votre code dans votre question.
Mise à jour question: comme u peut voir dans updateItem - je utiliser la même setGraphics méthode comme l'u.
Merci, ça fonctionne.
Je comprends, tous mes problèmes ici:if (commande==null){control==[someeditcontrol])};
OriginalL'auteur jewelsea