我正在尝试创建灵活的DataGrid。我有xls / xlsx解析器,它将表头保存到集合中并使用键(列计数器)和值(某些数据)保存数据,Box.class包含此映射,并且它具有@Bindable注释。在结果中必须创建包含任何数据的网格。
@Bindable
public class Box implements Serializable {
private static final long serialVersionUID = 1L;
private String valueStr;
private ExcelType excelType;
private Double valueDouble;
private Money money;
private HashMap<Integer, Object> mapData;
public Box(){
mapData = new HashMap<>();
}
public HashMap<Integer, Object> getMapData() {
return mapData;
}
public void setMapData(HashMap<Integer, Object> mapData) {
this.mapData = mapData;
}
public Double getValueDouble(){
return valueDouble;
}
public String getValueStr() {
return valueStr;
}
public ExcelType getExcelType() {
return excelType;
}
public Money getMoney(){
return money;
}
public void setValueStr(String valueStr) {
this.valueStr = valueStr;
}
public void setExcelType(ExcelType excelType) {
this.excelType = excelType;
}
public void setValueDouble(Double valueDouble) {
this.valueDouble = valueDouble;
}
public void setMoney(Money money) {
this.money = money;
}
public enum ExcelType{
STRING, BIGDECIMAL, INTEGER, NUMERIC, MONEY;
}
结果表
public class ResultTable extends WebPage {
private static final long serialVersionUID = 1L;
private List<Box> listBox;
private List<String> headers;
public ResultTable(List<Box> listBox, List<String> headers) {
super();
this.listBox = listBox;
this.headers = headers;
}
@Override
protected void onInitialize() {
// TODO Auto-generated method stub
super.onInitialize();
BoxBinding bb = new BoxBinding();
ListDataProvider<Box> listDataProvider = new ListDataProvider<Box>(listBox);
List<IGridColumn<Box, Box, String>> cols = new ArrayList<>();
HashMapBinding<Integer,Object> map = bb.mapData();
int columnCounter = 1;
for (int i = 0; i < 4; i++) {
//how to get object from map which in BoxBinding??
cols.add(new PropertyColumn<Box, Box, String, String>(new Model<String>(headers.get(i)),
map.get().get(columnCounter).toString()));//<---- NULLPOINTER!!!
columnCounter++;
}
DataGrid<IDataSource<Box>, Box,String> grid = new DefaultDataGrid("grid",
new DataProviderAdapter(listDataProvider), cols);
add(grid);
}
}
当我尝试添加带有标题(名称列)的新列并在地图中放置对象时,在BoxBinding中我有Nullpointer,因为在初始化时没有地图对象且没有任何对象,数据出现页面渲染后。 但是当我使用简单字段时,一切都还可以。
BoxBinding bb = new BoxBinding();
ListDataProvider<Box> listDataProvider = new ListDataProvider<Box>(listBox);
List<IGridColumn<Box, Box, String>> cols = new ArrayList<>();
cols.add(new PropertyColumn<Box, Box, String, String>(new Model<String>("name"), bb.valueStr().getPath()));
cols.add(new PropertyColumn<Box, Box, String, String>(new Model<String>("age"), bb.valueDouble().getPath()));
cols.add(new PropertyColumn<Box, Box, String, String>(new Model<String>("money"),
bb.money().getPath().toString()));
DataGrid<IDataSource<Box>, Box, String> grid = new DefaultDataGrid("grid",
new DataProviderAdapter(listDataProvider), cols);
如何在地图中的gridcolumn不存在的对象中引用?我想我是可以理解的。 Wicket是旧框架而不是网络中的很多例子(
答案 0 :(得分:0)
map.get().get(columnCounter).toString()
- 这是普通的Java!不需要Wicket知识就可以看到它可能在几个点上破裂!
什么是HashMapBinding?
为什么你希望在它上面调用.get()
在所有情况下都会返回非null?
为什么你期望调用.get(columnCounter)
也是非空的?
解决方案:将此行拆分为多行,并添加检查,表明上次调用的结果不为空,例如if (mapGetResult != null) {...}
。
如果您使用Java8,那么您可能会利用新的java.util.Map方法,例如getOrDefault()
,compute()
,computeIfAbsent()
等。