首页 > 解决方案 > 更改表格模型后编辑 JTable 单元格错误

问题描述

我有一个列表,单击删除时会删除该表并创建一个具有新值的新表。在这个函数中,我为表模型设置了 RowCount(0),这会导致 model.addTableModelListener 出现问题,当获取选定的列时,它会输出 -1 而不是列。

 public void SetList() {

    list.setModel(dlm);

    ClassesPanel.remove(list);
    dlm.removeAllElements();
    if(Classes != null)
    {
    for(int i = 0; i < Classes.length; i++) {
    dlm.addElement(Classes[i]);
    }

    }else {System.out.print("we null"); }
    //dlm.addElement("none");

    list.addListSelectionListener(new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent arg0) {
            try {
                if (!arg0.getValueIsAdjusting()) {
                    if(list.getSelectedValue().toString() != null) {
                    SelectedTab = list.getSelectedValue().toString();
                    }
                    try {
                        /// THIS IS WHERE I CREATE A NEW JTABLE /////
                        csvToArray(SelectedTab);
                        scrollPane_table.remove(table);
                        model.setRowCount(0);
                        table.setModel(model);
                        scrollPane_table.repaint();
                        table.repaint();        
                        SetTable();
                        model.fireTableDataChanged();

                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });



}

此代码运行良好,但我遇到问题的部分是在为新表设置值的末尾。

 public void SetTable() {
    table = new JTable(model);

    Object[] columnsName = new Object[columnsNumber1];
    columnsName[0] = "Name";
    for(int i = 1; i < columnsNumber1; i++) {
        if(Assignments[i] != null)
        columnsName[i] = Assignments[i].toString();
    }

    Object[] rowData = new Object[columnsNumber1];
    model.setColumnIdentifiers(columnsName);

    if(Students != null) {
    for(int i = 0; i < StudentList.size(); i++){

        rowData[0] = Students[i];
        for( int j = 1; j < columnsNumber1; j++)
        {
            System.out.println(columnsNumber1+" Number of col");
            rowData[j] = Grades[j-1];
        }
          model.addRow(rowData);
    }
    }

    table.setModel(model);
    scrollPane_table.add(table);
    //This works before selecting another item on the list but not after.
    model.addTableModelListener(new TableModelListener() {

        int selectedRowIndex = table.getEditingRow();;

        public void tableChanged(TableModelEvent e) {
              System.out.println("something changed at "+ table.getSelectedColumn()+table.getColumnName(table.getSelectedColumn()));

          }
        });
}

我不知道为什么这会出错,因为我在设置列表函数中重置了模型。

标签: javamodeljtablejlist

解决方案


不要创建新的 JTable。

您需要做的就是使用:

model.setRowCount(0);

这将从模型中删除所有数据。

TableModelListener 仍将添加到模型中,因此您也不需要重置它。

在该方法中您需要做的settable()就是使用 addRow(...) 方法将数据添加到模型中。

或者,如果表的结构正在发生变化(即您有不同的列),那么您将:

  1. 创建一个新的 TableModel 并将其添加到表中。
  2. 将 TableModelListener 添加到 TableModel

就是这样,仍然不需要创建新的 JTable。

scrollPane_table.remove(table);
scrollPane_table.add(table)

摆脱上面的代码。永远不要尝试从 JScrollPane 添加/删除组件。组件被添加到JViewportJScrollPane 中。如果您需要替换视口中的组件,则只需使用:

scrollPane.setViewportView(...);

编辑:

因此,您需要创建一个简单的示例,其中包含一个包含 JTable 的 JFrame 和一个带有 ActionListener 的 JButton 来更改表的模型。

所以基本代码是这样的:

table = new JTable( new DefaultTableModel(3, 5) );
frame.add(new JScrollPane(table), BorderLayout.CENTER);

JButton button = new JButton("Change Model");
frame.add(button, BorderLayout.PAGE_END);
button.addActionListener( new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        table.setModel( new DefaultTableModel(3, 7) );
    }
});

推荐阅读