更改表模型后编辑JTable Cells错误

时间:2018-05-16 22:12:09

标签: java model jtable jlist

我有一个列表,当单击删除时删除表并创建一个带有新值的新表。在此函数中,我为表模型设置了setRowCount(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()));

          }
        });
}

我不知道为什么这会因为我在设置列表功能中重置模型而出错。

1 个答案:

答案 0 :(得分:0)

不要创建新的JTable。

您需要做的就是使用:

model.setRowCount(0);

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

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

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

或者如果表的结构正在改变(即你有不同的列),那么你会:

  1. 创建一个新的TableModel并将其添加到表中。
  2. 将TableModelListener添加到TableModel
  3. 就是这样,仍然没有必要创建一个新的JTable。

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

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

    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) );
        }
    });