创建灵活的网格从地图获取数据

时间:2017-04-05 11:23:08

标签: java wicket

我正在尝试创建灵活的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是旧框架而不是网络中的很多例子(

1 个答案:

答案 0 :(得分:0)

map.get().get(columnCounter).toString() - 这是普通的Java!不需要Wicket知识就可以看到它可能在几个点上破裂!

什么是HashMapBinding?

为什么你希望在它上面调用.get()在所有情况下都会返回非null?

为什么你期望调用.get(columnCounter)也是非空的?

解决方案:将此行拆分为多行,并添加检查,表明上次调用的结果不为空,例如if (mapGetResult != null) {...}

如果您使用Java8,那么您可能会利用新的java.util.Map方法,例如getOrDefault()compute()computeIfAbsent()等。