簡體   English   中英

更新跨單元格 setHorizo​​ntalSpan 的 TableModel 會導致 IllegalArgumentException

[英]Updating TableModel of spanned cell setHorizontalSpan causes 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 row, 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: Row: 2 and column: 0 already occupied [EDT] 0:0:26,270 - 異常: java.lang.IllegalArgumentException - Row: 2 and column: 0 has been occupied at com.codename1.ui.table。 TableLayout.addLayoutComponent(TableLayout.java:931) at com.codename1.ui.table.TableLayout.removeLayoutComponent(TableLayout.java:1069) at com.codename1.ui.Container.removeComponentImplNoAnimationSafety(Container.java:1320) at com.codename1 .ui.Container.removeComponentImpl(Container.java:1309) at com.codename1.ui.Container.removeComponent(Container.java:1258) at 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 row, 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;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM