gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:44:21 24 4
gpt4 key购买 nike

我的 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 我将能够触发更改我自己的事件。然而,这并没有解决任何问题。任何人都可以在这里阐明我的问题吗?如果有人需要更多信息,我很乐意详细说明此案。

最佳答案

一个方法

FireTableDataChanged(); 

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

fireTableRowsInserted();

关于Java swing Jtable 未使用 AbstractTableModel 通过 fireXXX 进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24605841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com