首页 / 浏览问题 / 桌面GIS / 问题详情
iDesktopX java插件开发 如何使用IFormTabular展示数据
53EXP 2023年02月09日

iDesktopX java插件开发时

目前想用IFormTabular展示三维缓存图层中的属性值,但尝试失败,我应该怎么进行处理才对?代码如下:


                    FieldInfos infos = newLayer.getFieldInfos();
                    ArrayList<Integer> fieldIndexList = new ArrayList<Integer>();
                    for (int j = 0, k = 0; j < infos.getCount(); j++, k++) {
                        FieldInfo field = infos.get(j);
                        if (field.isSystemField() || field.isSystemFieldName(field.getName())) {
                            infos.remove(j--);
                            continue;
                        }
                        fieldIndexList.add(k);
                        BaseUtil.output("字段: ", field.getName(), field.getType().name());
                    }
                    Selection3D selection3D = newLayer.getSelection();
                    int f = 1;
                    Boolean run = true;
                    Recordset recordset1 = new MemRecordset(infos);
                    HashMap map = new HashMap();
                    while (run) {
                        selection3D.add(1);
                        for (int t : fieldIndexList) {
                            String name = infos1.get(t).getName();
                            Object value = newLayer.getFieldValueOfSelectedObject(t);
                            map.put(name, value);
                        }
                        recordset1.addNew(new GeoModel3D(), map);
                        break;
                    }
                    IFormTabular iFormTabular = (IFormTabular) FormUtilities.fireNewWindowEvent(WindowType.TABULAR);
                    iFormTabular.setRecordset(recordset1);

报错内容:

1个回答

您好,请问您断点调试下报错具体在哪一行呢,

创建属性表窗体的话,建议您使用fireNewTabularWindowEvent而不是fireNewWindowEvent

希望可以帮助到您。
9,638EXP 2023年02月10日

两种创建属性表窗体的代码都试过,一样的错误内容

// 第一种
IFormTabular iFormTabular = (IFormTabular) FormUtilities.fireNewWindowEvent(WindowType.TABULAR);
iFormTabular.setRecordset(recordset1);

// 第二种
IFormTabular iFormTabular = FormUtilities.fireNewTabularWindowEvent(recordset1);

是在创建属性表窗体后才报错的,即代码已经运行完成,属性表窗体已经创建好了,但里面没有任何内容,并且一直报错

具体错误内容:

不能转换'javax.swing.table.DefaultTableModel'为'com.supermap.desktop.tabularview.utilties.TabularTableModel'

您好看您代码是因为JTable进行getModel时获取到的是TableModel(javax.swing.table.TableModel )不可以转tabularTableModel的哈,

Jtable获取数据表模型转的话也只能转 (DefaultTableModel)

但是转tabularTableModel的那部分代码是超图属性表窗体自己封装的功能,不是我这边编写了

还是说我iFormTabular.setRecordset(recordset1);recordset1有问题? 导致table.getModel()没获取到正确的类型?

你这边转 tabularTableModel主要是为了做什么操作? TableModel或者 DefaultTableModel 没法实现吗

转tabularTableModel的操作是iDesktopX的代码,不是我这边执行转的

我这边只是定义创建属性表窗体,然后设置Recordset,我这边的代码就已经完成了

我这边测试没有出现这个报错,您看一下您对数据集最直接query查询得到的记录集传进来是否会报错。

您记录集编辑的时候,addnew后注意update一下,还有看到您addnew传了一个空的GeoModel3D是什么业务需求呢?

看您new了一个内存记录集,记录集建议您从已有的记录集或者数据集取selection3D.toRecordset或者selection3D.getRecordset

addnew传了一个空的GeoModel3D 是因为有试过addnew(null, map)是会出现null错误


可能是因为我是新手的原因,我的目的就是用属性表窗体展示map对象的属性,

所以我使用MemRecordSet来存在属性值,会不会是不是属性表窗体不支持MenRecordSet导致的问题?

最终改用创建临时数据源-创建属性表数据集这种方式实现了,感谢你的解答
...