JavaFX 8 Personnalisé ListView Cellules c'est le Mal

J'ai personnalisé ListView cellule j'ai HBox avec deux contrôles:

  1. Étiquette avec nom de domaine
  2. 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

JavaFX 8 Personnalisé ListView Cellules c'est le Mal

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

JavaFX 8 Personnalisé ListView Cellules c'est le Mal

comme ici u peut voir TextField ne peut pas être concentré et édité.

Complet, un minimum de code pour la réplication de votre question est importante pour l'analyse. Si vous souhaitez plus d'aide avec notamment la mise en œuvre et voudrais quelqu'un pour étudier et expliquer pourquoi il ne fonctionne pas, vous devez placer le code à reproduire le problème en un édité question comme un SSCCE.
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