我试图为ListView创建自定义单元格,但是什么也没有出现...
我在使用ListView的菜单控制器中必须包含项目:
FXML(仅空白页面进行测试):
<AnchorPane fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="200.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.exalow.easymind.ui.factory.ProjectCell" />
public class MenuController extends Controller implements Initializable {
private final ListView<Project> projectListView = new ListView<>();
public MenuController(EasyMind api,Stage stage) {
super(api,stage);
}
@Override
public void initialize(URL location,ResourceBundle resources) {
ObservableList<Project> observableList = FXCollections.observableArrayList();
observableList.addAll(api.getProjects());
projectListView.setItems(observableList);
FXMLLoader loader = new FXMLLoader(getclass().getResource("/view/fxml/ProjectCell.fxml"));
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
projectListView.setCellFactory(cellFactory -> loader.getcontroller());
}
还有我的细胞控制器
public class ProjectCell extends ListCell<Project> implements Initializable {
private Project project;
@FXML
private AnchorPane root;
@FXML
private ImageView imageView;
@FXML
private Label nameLabel;
@FXML
private Label descriptionLabel;
@FXML
private Label createDateLabel;
@Override
public void initialize(URL location,ResourceBundle resources) {
setGraphic(root);
}
@Override
protected void updateItem(Project item,boolean empty) {
super.updateItem(item,empty);
if (empty || item == null) {
setText(null);
setGraphic(null);
} else {
if (project.hasImage()) {
imageView.setImage(new Image(project.getImageUrl()));
} else imageView.setImage(new Image(project.getDefaultImage()));
nameLabel.setText(item.getName());
descriptionLabel.setText(item.getDescription());
createDateLabel.setText(item.getcreateDate().toString());
}
this.project = item;
}
}
我没有错误,但是打开应用程序时,ListView中没有单元格。
可复制的示例:
任何ProjectCell都已创建...
public class ProjectCellController {
@FXML
private AnchorPane root;
@FXML
private ImageView imageView;
@FXML
private Label nameLabel;
@FXML
private Label descriptionLabel;
@FXML
private Label createDateLabel;
private Project project;
public void setProject(Project project) {
if (project.hasImage()) {
imageView.setImage(new Image(project.getImageUrl()));
} else imageView.setImage(new Image(project.getDefaultImage()));
nameLabel.setText(project.getName());
descriptionLabel.setText(project.getDescription());
createDateLabel.setText(project.getcreateDate().toString());
this.project = project;
}
}
public class ProjectCell extends ListCell<Project> {
private AnchorPane root;
private ProjectCellController controller;
public ProjectCell() {
try {
FXMLLoader loader = new FXMLLoader(getclass().getResource("/view/fxml/ProjectCell.fxml"));
root = loader.load();
controller = loader.getcontroller();
} catch (IOException exc) {
throw new RuntimeException(exc);
}
}
@Override
protected void updateItem(Project project,boolean empty) {
if (empty || project == null) {
setGraphic(null);
} else {
controller.setProject(project);
setGraphic(root);
}
}
}
和FXML(基本的空白锚定窗格):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="200.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.exalow.easymind.ui.controllers.ProjectCellController" />