2015-09-18 3 views
0

У меня есть JTable, у которого есть флажки. В этой таблице реализована таблица listenChanged, которая вызывает событие eventChanged с true или false, если флажок установлен или нет.JTable Checkbox прослушиватель не работает должным образом

В элементе 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

, но это мое решение false, оно работает, но иногда оно не работает должным образом, а счетчик увеличивается, если я нажимаю в любом месте флажка.? – 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); 
    } 
}); 
Смежные вопросы