Java swing Jtable没有使用AbstractTableModel通过fireXXX进行更新

时间:2014-07-07 08:12:31

标签: java swing jtable abstracttablemodel

我的GUI中有一个JTable,我希望动态更新。 与Jtable相关联当然是一个TableModel,我在其中扩展了AbstractTableModel并覆盖了适当的方法。

我的JTable有四种方法:

  • AddRow
  • CopySelectedRow
  • DeleteSelectedRow
  • DeleteAll

当我运行AddRow或CopySelectedRow时,表格是'后面的一个更新':

如果我按下newRow一次,视觉上就什么都没发生了。

如果我按两次newRow,则显示第一个,而第二个不显示。

但是,当我点击(即不在后面)时,使用deleteSelected或deleteAll更新表。

我的TableModel类的提取:

public class TableModel extends AbstractTableModel {

private List<String[]> data;

public TableModel() {
    data = new ArrayList<String[]>();
}

...

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    data.get(rowIndex)[columnIndex] = aValue.toString();
    fireTableCellUpdated(rowIndex, columnIndex);
}

public void addRow(String[] aValue) {
    data.add(aValue);
    fireTableRowsInserted(data.size()-1, data.size()-1);
}

public void copyRow(int rowIndex) {
    addRow(data.get(rowIndex));
}

public void removeRow(int rowIndex) {
    data.remove(rowIndex);
    fireTableRowsDeleted(rowIndex, rowIndex);
}

我如何称呼他们:

JButton newRow = new JButton("New row");
    newRow.addActionListener(new ActionListener() {
        // Handling newRow event
        public void actionPerformed(ActionEvent e) {
            tableModel.addRow(new String[]{"", "", "", "", "", "", "", "", "", "", ""});
        }
    });

    JButton copyRow = new JButton("Copy selected row");
    copyRow.addActionListener(new ActionListener() {
        // Handling copyRow event
        public void actionPerformed(ActionEvent e) {
            if (table.getSelectedRow() != -1) {
                tableModel.copyRow(table.getSelectedRow());
            }
        }
    });

    JButton deleteRow = new JButton("Delete selected row");
    deleteRow.addActionListener(new ActionListener() {
        // Handling deleteRow event
        public void actionPerformed(ActionEvent e) {
            if (table.getSelectedRow() != -1) {
                tableModel.removeRow(table.getSelectedRow());
            }
        }
    });

    JButton deleteAllRows = new JButton("Delete all rows");
    deleteAllRows.addActionListener(new ActionListener() {
        // Handling deleteAllRows event
        public void actionPerformed(ActionEvent e) {
            for (int i = tableModel.getRowCount() - 1; i >= 0; i--) {
                tableModel.removeRow(i);
            }
        }
    });

编辑:

我选择使用AbstractTableModel,因为我遇到了与DefaultTableModel相同的问题(每当我添加一行时,它都没有添加,直到下一个'添加'),并且使用AbstractTableModel我将能够触发更改事件我自己。但是,它没有解决问题。有谁能在这里解释一下我的问题?如果有人需要更多信息,我很乐意详细说明这个案例。

1 个答案:

答案 0 :(得分:0)

方法

FireTableDataChanged(); 

检测表数据对象中的任何类型的更改并分别更新GUI,您可以尝试而不是

fireTableRowsInserted();