2017-01-12 49 views
0

我有一個函數可以創建一個使用複選框的通用TabelModel。但是,當我多次調用此方法時,我發現兩個表中的CheckBox都相互干擾(單擊一個表,另一個表也單擊)。帶複選框的Java多表模型相互干擾

什麼可能導致引用相互碰撞?

private TableModel<Map<String, Object>> createModel() { 
    List<Map<String, Object>> list = new ArrayList<>(); 
    TableModel<Map<String, Object>> model = new TableModel<Map<String, Object>>(list, 
                       Arrays.asList("Name", "Enabled"), 
                       Arrays.asList("Enabled"), null) { 

     @Override 
     public Object getValueAt(int row, int column) { 
      final Map<String, Object> object = data.get(row); 
      return object.get(columnNames.get(column)); 
     } 

     @Override 
     public Class<?> getColumnClass(int col) { 
      if (col == 1) { 
       return Boolean.class; 
      } 
      return super.getColumnClass(col); 
     } 

     @Override 
     public void setValueAt(Object aValue, int row, int column) { 
      final Map<String, Object> object = data.get(row); 
      object.put(columnNames.get(column), aValue); 
      fireTableCellUpdated(row, column); 
     } 
    }; 
    return model; 
} 
JTable tableA = new JTable (createModel()); 
JTable tableB = new JTable (createModel()); 

即使表A和tableB的使用兩種不同的模式(或他們?),當我點擊在tableA的複選框,tableB的也反應了。不知何故,複選框變得糾結。爲什麼會發生?

+2

我會做的第一件事情,如果這是我的問題,我在這裏問的是創建和發佈有效[mcve]我的問題,因爲我知道這將是讓人們完全理解我的問題然後幫助我的最好和最快捷的方式。 –

+1

什麼是數據?這似乎是一個共享資源,所以這兩個表將使用相同的'數據'來源... – MadProgrammer

+0

@MadProgrammer嗯....這可能是共享資源。可能必須重做「getValueAt」方法 – user2494663

回答

0

該字段'數據'正在填充完全相同的對象,這種情況下一個地圖。數據只是一個持有該模型所持有的任何數據的對象。 MadProgrammer是正確的數據被共享,並且解決方案是使數據加載到表單獨