JavaFX 8 пользовательских ячеек ListView это зло
У меня есть пользовательская ячейка ListView У меня есть HBox с двумя элементами управления:
Метка с полем имениЭто's должен генерироваться из контекста объектаНапример, я устанавливаю массив элементов ListView полей класса, если тип поля Boolean, я создаю CheckBox, если String, я создаю TextField и т. Д.
Проблема в том, что я получаю объект Field только в методе updateItem () - и только там я могу создавать свои элементы управления.
В JavaFX 7 все работает нормально, но на Java 8 - я не вижу своих элементов управления.
Существует ли правильный способ разрешить мое дело?
ОБНОВЛЕНИЕ 1
Вот полный пример для повторяющейся проблемы:
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 {
/**
* 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 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() {
@Override
public ListCell call(ListView p) {
return new MyListCell();
}
});
}
}
Вот скриншот программы JDK 7
Как вы можете видеть, я TextField может быть сфокусирован и отредактирован.
Но если я запускаю этот пример с JDK 8, я получаю
Как вы видите, TextField не может быть сфокусирован и отредактирован.