我有自定义 ListView 单元格,我有带有两个控件的 HBox:
- 带有名称字段的标签
- 它必须从对象的上下文中生成
例如,我设置类字段的 ListView 项目数组,如果字段类型为 Boolean,我创建 CheckBox,如果 String 我创建 TextField 等。
问题是:我只在方法 updateItem() 中获取 Field 对象 - 只有在那里我才能创建我的控件。
在 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<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();
}
});
}
}
这是程序JDK 7的屏幕截图
如您所见,我可以对 TextField 进行聚焦和编辑。
但是如果我用 JDK 8 运行这个例子,我得到了
在这里你可以看到 TextField 不能被聚焦和编辑。