我的GUI中有一个JTable,我希望动态更新。 与Jtable相关联当然是一个TableModel,我在其中扩展了AbstractTableModel并覆盖了适当的方法。
我的JTable有四种方法:
当我运行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我将能够触发更改事件我自己。但是,它没有解决问题。有谁能在这里解释一下我的问题?如果有人需要更多信息,我很乐意详细说明这个案例。
答案 0 :(得分:0)
方法
FireTableDataChanged();
检测表数据对象中的任何类型的更改并分别更新GUI,您可以尝试而不是
fireTableRowsInserted();