JTable -如何获得删除的行



我使用JTable, DefaultTableModel作为模型,DefaultListModel作为模型本身的底层数据-因此JTable显示数据,存储在此列表中。

在JTable中,当元素从模型中添加/删除时,我得到通知(通过DefaultTableModel触发的fireTableRowsInsertedfireTableRowsDeleted)。

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

我确实需要在删除特定元素时执行一些清理,但似乎只有在删除之后才会出现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();
        }
    });
}
}

TableData.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变化之前/当他们发生?还是我显示数据的方式不正确,我应该使用其他机制?(哪一个?)

一个更多的信息没有画在这里:我使用也实现ListDataListener在MyTableModel,所以我听的变化在TableData,然而,这是不够的。

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

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

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

或者如果您正在使用其他自定义TableModel,则需要重写删除行的方法。

我处理这个问题的方法是,我强迫用户在行内标记一个复选框(列标记为"Delete"),然后添加一个按钮或右键菜单选项来执行删除事件。关键是,执行的动作事件被触发,并且在该调用中,我确定选择了哪一行,检索数据,并继续进行最后一步,即删除该行。

----- EDIT -------

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

相关内容

  • 没有找到相关文章

最新更新