2015-09-18 59 views
0

我有一個有複選框的JTable。 該表實現了偵聽器tableChanged,如果選擇了複選框,它將觸發事件selectionChanged以true或false。JTable複選框偵聽器無法正常工作

在selectionChanged中,有一個計數器可以知道檢查了多少個複選框。但是這不能正常工作。如果我點擊複選框上的任何地方,它也會增加計數器。

這是它的樣子:

@Override 
    public void tableChanged(TableModelEvent P_evt) 
    { 
    ..... 
    listener.selectionChanged(F_newValue); 

@Override 
    public void selectionChanged(boolean P_selected) 
    { 
     if (P_selected) 
     { 
      nextButton.setEnabled(true); 
      selectedBundles++; 
      System.out.println("Selected Bundles: " + selectedBundles); 
     } 
     if(!P_selected) 
     { 
      nextButton.setEnabled(false); 
      selectedBundles--; 
      System.out.println("Selected Bundles: " + selectedBundles); 
     } 
     if (selectedBundles > 0) 
     { 
      nextButton.setEnabled(true); 
     } 
     else 
     { 
      nextButton.setEnabled(false); 
     } 
+0

每個JTable當然都有一個TableModel,它包含實際的數據。你爲什麼不能在那裏處理? – ControlAltDel

+0

你是什麼意思,我有TableModel,但我不想改變表的數據.. – seriously

+1

TableModel.setValueAt當你檢查/取消選中JTable中的布爾值時被調用。你可以重寫這個來計算你的檢查次數或保持檢查字段的當前值 – ControlAltDel

回答

0

@seriously

也許這可以幫助你。

public class TableModel extends AbstractTableModel { 

private List<CheckboxValues> checkbox = new ArrayList<CheckboxValues>(); 


public void assignData(List<CheckboxValues> checkbox) {  
    this.checkbox = checkbox; 
    fireTableDataChanged();         
    } 

//Fill Model with Data 
@Override 
public Object getValueAt(int row, int col) { 

    switch(col) {          // Es wird die Spalte ausgewählt 
    case 0: 
     return checkbox.row0; 

    case 1: 
     return checkbox.row1; 

} 


@Override 
public void setValueAt(Object value, int row, int col) { 

    int columnFromCheckboxes; 
    int numberOfselectedCheckboxes; 

    if(col == columnFromCheckboxes){ 

     if(value == true){ 
      columnFromCheckboxes++; 
     } 
    } 
} 

}

+0

但我的解決方案錯誤,它的工作原理,但有時它不能正常工作,並且計數器增加,如果我點擊複選框周圍的任何地方..? – seriously

0

焦點的改變並不一定意味着用戶改變的值。

您應該使用TableModelListener來觀察底層數據的實際變化。

下面是一個TableModelListener的簡單示例,它將計算選中框的數量。

//Setup a listener for changes in the table 
table.getModel().addTableModelListener(new TableModelListener() { 

    @Override 
    public void tableChanged(TableModelEvent e) { 
     int selectedBundles= 0; 
     //Count all checked boxes 
     for(int i=0; i<table.getRowCount(); i++){ 
      if(table.getValueAt(i, COLUMN_NUMBER).equals(Boolean.TRUE)){ 
       selectedBundles++; 
      } 
     } 

     System.out.println("Selected Bundles: " + selectedBundles); 
    } 
}); 
相關問題