[英]Updating checkboxes in Jtable goes into recursion, causes stack overflow error
我在一個帶ID和復選框的選項卡式窗格中設置了Jtable。 表格看起來與此類似,其中.
是復選框。
| VAR1 |
ID | ALL | subVar1 | subVar2 |
------------------------------
id1| . | . | . |
現在,我還將一個TableListener附加到該表。 我想發生的事情是,每當用戶按下ALL復選框時,都需要選中該行中的所有復選框(即true)。 這是表偵聽器代碼。
@Override
public void tableChanged(TableModelEvent e) {
if(e.getSource() == assignedTableModel) {
for (int i = 0; i < aTable.getRowCount(); i++) {
boolean isAllChecked = (Boolean) aTable.getValueAt(i, 1);
if(isAllChecked) {
assignedTableModel.setValueAt(Boolean.TRUE, i, j);
}
else {
...
}
}
}
}
單擊ALL復選框,使表發生更改, assignedTableModel.setValueAt(Boolean.TRUE, i, j);
調用后,表將再次更改,因此將調用偵聽器,偵聽器將再次調用此函數。
我的問題是,還有另一種更新復選框的方法嗎? 還是有辦法設置基礎以擺脫遞歸?
編輯行是動態添加的。 我想知道是否將actionListener添加到ALL復選框中,這將是一個解決方案。 我將返回結果。
EDIT2我忘了提及整個表是動態生成的。 這意味着我無法知道將出現多少列和行,我只知道ID和ALL列。 已經給出的大多數答案都與硬編碼實現有關。
每當用戶按下ALL復選框時,該行中的所有復選框都會被選中
那么,為什么要遍歷代碼中的所有行呢? 該事件僅針對您單擊的行生成,並且您只需要為該行的列選擇復選標記。 擺脫循環代碼。
該表將再次更改,因此將調用偵聽器,該偵聽器將再次調用此函數。
您需要一個if條件來標識何時選中第一列中的復選框:
if (e.getType() == TableModelEvent.UPDATE)
{
int row = e.getFirstRow();
int column = e.getColumn();
if (column == 0)
{
TableModel model = (TableModel)e.getSource();
model.setValueAt(Boolean.true, row, 1);
...
}
}
現在,其他列的狀態更改將被忽略。
基於@camickr的響應,以下代碼似乎可以解決問題。 謝謝。
@Override
public void tableChanged(TableModelEvent e) {
if (e.getType() == TableModelEvent.UPDATE && e.getSource() == assignedTableModel)
{
int row = e.getFirstRow();
int column = e.getColumn();
if (column == 1)
{
DefaultTableModel model = (DefaultTableModel) e.getSource();
for(int i=2 ; i<model.getColumnCount() ; i++) {
if((boolean) model.getValueAt(row, 1))
model.setValueAt(Boolean.TRUE, row, i);
else
model.setValueAt(Boolean.FALSE, row, i);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.