2017-01-12 43 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是正确的数据被共享,并且解决方案是使数据加载到表单独