如何解决更新跨单元格setHorizontalSpan的TableModel会导致IllegalArgumentException
使用con.setHorizontalSpan(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 举报,一经查实,本站将立刻删除。