0

我使用JTablewithDefaultTableModel作为模型和DefaultListModel模型本身内的基础数据 - 所以 JTable 正在显示存储在此列表中的数据。

fireTableRowsInserted在 JTable 中,当从模型中添加/删除元素时(通过 DefaultTableModel并由fireTableRowsDeletedDefaultTableModel 触发),我会收到通知。

是否有可能获取已删除的元素内容?

当删除特定元素时,我确实需要执行一些清理,但似乎 fireTableRowsDeleted 通知仅在删除之后才出现,这为时已晚。

---- 编辑:为了获得更好的图片,假设 SSCCE 看起来像这样:

TableDemo.java

import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TableDemo extends JPanel {

public TableDemo() {
    super(new GridLayout(1,0));

    JTable table = new JTable(new MyTableModel());
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setFillsViewportHeight(true);

    JScrollPane scrollPane = new JScrollPane(table);

    add(scrollPane);
}

class MyTableModel extends AbstractTableModel {
    private String[] columnNames = {"Object Name"};

    private TableData data = new TableData();

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        return data.getSize();
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data.elementAt(row);
    } 

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    } 

    public boolean isCellEditable(int row, int col) {         
        if (col < 2) {
            return false;
        } else {
            return true;
        }
    } 

    public void setValueAt(Object value, int row) {
        data.setElementAt(value, row);
        fireTableCellUpdated(row, 0);
    }
} 

private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("TableDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    TableDemo newContentPane = new TableDemo();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

表数据.java

import javax.swing.DefaultListModel;


public class TableData extends DefaultListModel {
public TableData() {
    for(int i = 0; i < 10; i++)
    super.addElement("Object " + i);        
}   
}

TableDemo 是 UI 级别的一部分,TableData 类是我的 Model 级别的一部分,并且在后端进行了更新。然后这些数据显示在前端,但那里没有交互/编辑功能。然而,在某些时候应用程序需要对一些变化做出反应——比如删除一些元素等。

有什么方法,如何在 TableData 发生更改之前/发生时得到通知?还是我显示数据的方式不正确,我应该使用其他机制?(哪一个?)

此处未绘制的另一条信息:我也在 MyTableModel 中使用实现 ListDataListener,因此我正在监听 TableData 中的更改,但是,这还不够。

4

2 回答 2

1

一旦从模型中删除数据,就无法获取数据,除非您自己管理该功能。

您可能正在使用removeRow(...)DefaultTableModel 中的方法。

如果要在删除之前跟踪行,则需要覆盖该removeRow(...)方法并在删除之前跟踪数据。

或者,如果您正在使用其他一些自定义 TableModel,则需要覆盖删除该行的方法。

于 2014-03-18T15:38:20.030 回答
0

我处理此问题的方式是强制用户标记行内的复选框(列标记为“删除”),然后添加执行删除事件的按钮或右键单击菜单选项。关键是,触发了执行的操作事件,并且在该调用中,我确定选择了哪一行,检索数据,然后继续进行最后一步是删除该行。

- - - 编辑 - - - -

您还需要实现自己的抽象表模型实现,以便您可以实现上述内容。DefaultTableModel 并不是我真正用于任何严肃编码的东西,主要是因为删除了很多控件。

于 2014-03-18T15:45:23.143 回答