2014-12-07 116 views
0

(我不确定标题,因为我不知道如何明确表达我的想法)。Java Map <整数,列表<Object>>不支持以前的数据

我有一个JTable。每次用户想要更改其中的一些数据时,我都希望将旧数据保存在列表中。然后我想做一些SQL更新的东西,所以我想知道更改发生的确切行。因此我决定创建一个具有特定行作为关键字的Map和包含旧数据(Map>)的列表。

下面有我的代码

public class MapListsInJtable extends JFrame{ 
    private final Object[][] rowdata = { {"one",1}, {"two",2}, {"three",3}}; 
    private final Object[] colnames = {"col1", "col2", "col3"}; 
    private final List<Object> oldValues; //for updated list 
    private final Map<Integer,List<Object>> updatedList; 
    private DefaultTableModel model; 
    private JTable table; 
    private JScrollPane scrollPane; 

    public MapListsInJtable(){ 
    this.updatedList = new Hashtable<>(); 
    this.oldValues = new ArrayList<>(); 
    initializeTable(); 
    } 

    private void initializeTable(){ 
    model = new DefaultTableModel(rowdata,colnames); 
    table = new JTable(model){ 

     @Override 
     public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) { 
      super.changeSelection(rowIndex, columnIndex, toggle, extend); 
      if(toggle){ 
       //user gathers rows in order to delete them by holding ctrl 
       System.out.println("toggling..."); 
       for(int i = 0; i < model.getColumnCount(); i++) 
        oldValues.add(table.getValueAt(rowIndex, i)); 
      } 
      else{ 
       //user presses left mouse button and selects multiple rows 
       if(extend){ 
        System.out.println("extends..."); 
        for(int i = 0; i < model.getColumnCount(); i++) 
         oldValues.add(table.getValueAt(rowIndex, i)); 
       } 
       else{ 
        oldValues.clear(); 
       } 
      } 
     } 
    }; 
    //to see if there has been change in table data 
    ListSelectionHandler handler = new ListSelectionHandler(this); 
    table.getSelectionModel().addListSelectionListener(handler); 

    table.setCellSelectionEnabled(false); 
    table.setCellSelectionEnabled(false); 
    table.setColumnSelectionAllowed(false); 
    table.setRowSelectionAllowed(true); 
    //resize columns and use horizontal scroll bar to view data 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    //disable column dragging 
    table.getTableHeader().setReorderingAllowed(false); 
    scrollPane = new javax.swing.JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
} 

protected DefaultTableModel getModel(){return model;} 
public JTable getTable(){return table;} 
public List<Object> getOldValues(){return this.oldValues;} 
public Map<Integer,List<Object>> getUpdatedList(){return this.updatedList;} 

public void initializeUI(){ 
    getContentPane().add(scrollPane); 
    setSize(300,150); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
} 

private class ListSelectionHandler implements ListSelectionListener{ 
    private final MapListsInJtable m; 

    public ListSelectionHandler(MapListsInJtable m){this.m = m;} 

    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     //in order not valueChanged to be called twice 
     boolean hasBeenAdjusted = e.getValueIsAdjusting(); 
     if(hasBeenAdjusted == true){ 
      int selectedRow = m.getTable().getSelectedRow(); 
      //put data in updatedList 
      for(int i = 0; i < m.getModel().getColumnCount(); i++) 
       m.getOldValues().add(m.getTable().getValueAt(selectedRow, i)); 
      m.getUpdatedList().put(selectedRow, m.getOldValues()); 
      System.out.println("updatedList: " + m.getUpdatedList()); 
      } 
     } 
    } 

    public static void main(String[] af){ 
    MapListsInJtable m = new MapListsInJtable(); 
    m.initializeUI(); 
    } 
} 

当我选择一个行,数据里面updatedList投入正常。

输出:

updatedList: {0=[`one, 1, null`]} 

但是,当我选择另一行,我有内部updatedList 2位新行的数据。之前的所有数据都没有了。

输出:

updatedList: {1=[`two, 2, null`], 0=[`two, 2, null`]} 

可能有人请解释一下我为什么会这样呢?我该如何解决它?谢谢你在前进

+0

你必须写自己的TabelModel(https://开头的文档。 oracle.com/javase/tutorial/uiswing/components/table.html)更多内容,请阅读MVC ... – TungstenX 2014-12-07 16:29:52

+0

Will TabelModel将解决Map问题吗?以什么方式? – 2014-12-07 16:33:10

+0

您实现的TableModel将具有一个数据结构,用于保存您的数据并处理对表的更改。 http://docs.oracle.com/javase/8/docs/api/javax/swing/table/TableModel.html – TungstenX 2014-12-07 16:39:56

回答

1

我觉得这段代码的问题是:

int selectedRow = m.getTable().getSelectedRow(); 
       //put data in updatedList 
       for(int i = 0; i < m.getModel().getColumnCount(); i++) 
        m.getOldValues().add(m.getTable().getValueAt(selectedRow, i)); 
       m.getUpdatedList().put(selectedRow, m.getOldValues()); 
       System.out.println("updatedList: " + m.getUpdatedList()); 
       } 

所以,试试这个:

int selectedRow = m.getTable().getSelectedRow(); 
       //put data in updatedList 
       for(int i = 0; i < m.getModel().getColumnCount(); i++) 
       m.getOldValues().add(m.getTable().getValueAt(selectedRow, i)); 
       List oldvalue = ((List) ((ArrayList) m.getOldValues()).clone()); 
       m.getUpdatedList().put(selectedRow, oldvalue); 
       System.out.println("updatedList: " + m.getUpdatedList()); 
       } 
+0

所以你说不要把for循环?我会在'm.getOldValues()。add(m.getTable()。getValueAt(selectedRow,i))'列中的位置有什么?';我是列迭代器 – 2014-12-07 16:53:49

+0

错误重新编辑 – Mailkov 2014-12-07 16:54:34

+0

我认为错误是在改变中加入 – Mailkov 2014-12-07 16:55:29

相关问题