[英]Updating TableModel of spanned cell setHorizontalSpan causes 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 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.