微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更新跨单元格setHorizo​​ntalSpan的TableModel会导致IllegalArgumentException

如何解决更新跨单元格setHorizo​​ntalSpan的TableModel会导致IllegalArgumentException

使用con.setHorizo​​ntalSpan(2);尝试更新TableModel时产生IllegalArgumentException, 如果删除此行代码,表将正常更新;我基本上需要跨特定的单元格,并隐藏那些不需要显示的单元格,如果我更新数据,则单元格跨度可能会根据新数据而改变,

class MyTable extends AbstractTableModel {

    public int getRowCount() {
        return 3;
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public String getColumnName(int arg0) {
        return arg0*10 + "";
    }

    @Override
    public boolean isCellEditable(int arg0,int arg1) {
        return false;
    }

    @Override
    public Object getValueAt(int arg0,int arg1) {
        return ((arg0 * cst + arg1) % 10);
    }

    @Override
    public void setValueAt(int arg0,int arg1,Object arg2) {

    }
    List<DataChangedListener> list = new ArrayList<DataChangedListener>();

    @Override
    public void addDatachangelistener(DataChangedListener arg0) {
        list.add(arg0);
    }

    @Override
    public void removeDatachangelistener(DataChangedListener arg0) {
        list.remove(arg0);
    }

    public void update() {
        for (int i = 0; i < 3; i++) {
            for (int o = 0; o < 3; o++) {
                for (DataChangedListener d : list) {
                    d.dataChanged(i,o);
                }
            }
        }

    }
}

public void testTable() {
    MyTable tm = new MyTable();

    current = new Form("Test");

    Table b = new Table(tm) {
        protected TableLayout.Constraint createCellConstraint(Object value,int row,int column) {

            TableLayout.Constraint con = super.createCellConstraint(value,row,column);
            con.setHorizontalSpan(1);
            if (value.toString().equals("1")) {
                //IF I REMOVE THIS LINE< THE PROGRAM WORKS
                con.setHorizontalSpan(2);
            }
            con.setWidthPercentage(100 / 3);
            return con;
        }

        @Override
        protected Component createCell(Object value,int column,boolean editable) { // (1)

            Label label = new Label();
            System.err.println("c: " + column + " r: " + row);
            if (column != 0) {
                if (value.equals("2")) {
                    return label;
                }
            }
            label.setText(value.toString());
            return label;
        }
    };
    Button bt = new Button("test");

    bt.addActionListener(
            new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            cst++;
            tm.update();
        }
    }
    );
    current.setLayout(
            new BoxLayout(BoxLayout.Y_AXIS));
    current.add(bt);

    current.add(b);

    current.show();
}

错误

java.lang.IllegalArgumentException:行:2和列:0已被占用 [EDT] 0:0:26,270-异常:java.lang.IllegalArgumentException-行:2和列:0已被占用 在com.codename1.ui.table.TableLayout.addLayoutComponent(TableLayout.java:931)处 在com.codename1.ui.table.TableLayout.removeLayoutComponent(TableLayout.java:1069) 在com.codename1.ui.Container.removeComponentImplNoAnimationSafety(Container.java:1320) 在com.codename1.ui.Container.removeComponentImpl(Container.java:1309) 在com.codename1.ui.Container.removeComponent(Container.java:1258) 在com.codename1.ui.table.Table $ Listener.dataChanged(Table.java:1013) 在com.alhanah.samicalapp.SamiApplication $ MyTable.update(SamiApplication.java:95)

解决方法

如果您有两个相邻的单元格,并且一个单元格在另一个单元格的顶部隐藏另一个,则将导致问题,因为我们不知道要渲染哪个单元格。因此,您的模型需要考虑到这一点,并通过扩展为“隐藏”的单元格提供空数据。

您也不能跨过最后一列,因此您也需要注意这一点。

因此,您需要对表模型进行以下两项更改,我使它变得相对简单。这是表格中的内容,只是不跨越最后一列:

        @Override
        protected TableLayout.Constraint createCellConstraint(Object value,int row,int column) {

            TableLayout.Constraint con = super.createCellConstraint(value,row,column);
            con.setHorizontalSpan(1);
            if (column != 2 && value.toString().equals("1")) {
                con.setHorizontalSpan(2);
            }
            // another minor fix so this adds up to 100
            if(col < 2) {
                 con.wp(33);
            } else {
                 con.wp(34);
            }
            return con;
        }

这是在模型中。只需为跨列返回null:

        @Override
        protected Component createCell(Object value,int column,boolean editable) { 

            Label label = new Label();
            System.err.println("c: " + column + " r: " + row);
            if (column != 0) {
                if (value.equals("2")) {
                    return label;
                }
                Object o = getModel().getValueAt(row,column - 1);
                if(o != null && o.equals("1")) return null;
            }
            label.setText(value.toString());
            return label;
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?