簡體   English   中英

Jtable中的更新復選框進入遞歸狀態,導致堆棧溢出錯誤

[英]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.

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