ho cella ListView personalizzato ho HBox con due controlli:JavaFX 8 personalizzato ListView Cells è male
- Etichetta con il campo nome
- E 'd'obbligo generato dal contesto di oggetto
Per esempio Ho impostato l'array di elementi ListView di Campi classe, se campo tipo Booleano creo CheckBox, se String i creo TextField ed ecc.
Il problema è: ottengo Oggetto campo solo nel metodo updateItem() - e solo lì posso creare i miei controlli.
In JavaFX 7 funziona tutto bene, ma su Java 8 non vedo i miei controlli.
Esiste il modo corretto per risolvere il caso?
UPDATE 1
esempio Qui completo per problema replicare:
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();
}
});
}
}
Qui schermata del programma JDK 7
come u può vedere i TextField possono perseguire e modificato.
Ma se corro questo esempio con JDK 8 I Got
come qui u può vedere TextField cant essere messo a fuoco e modificato.
Il codice completo e minimo per la replica del problema è importante per l'analisi. Se desideri ulteriore assistenza con la tua particolare implementazione e vorresti che qualcuno indagasse e spiegasse perché non funziona, dovrai inserire il codice per replicare il problema in una domanda modificata come [SSCCE] (http://sscce.org). – jewelsea
Mentre la domanda è molto utile, potresti aggiornare il titolo? Dovrebbe riflettere in modo più accurato ciò che si trova così male negli oggetti ListCell personalizzati in javafx8. – demongolem