[英]JTable - how to get deleted rows
我将JTable
与DefaultTableModel
用作模型,并将DefaultListModel
用作模型本身内的基础数据-因此JTable将显示存储在此List中的数据。
在JTable中,当从模型中添加/删除元素时,我会收到通知(通过由DefaultTableModel触发的fireTableRowsInserted
和fireTableRowsDeleted
)。
是否有可能获取已删除的元素的内容?
删除特定元素时,我确实需要执行一些清理操作,但是似乎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中更改的通知? 还是我显示数据的方式不正确,应该使用其他机制? (哪一个?)
此处未绘制另一条信息:我还在MyTableModel中实现ListDataListener,因此我正在侦听TableData中的更改,但是,这还不够。
一旦将数据从模型中删除,就无法获取数据,除非您自己管理该功能。
您可能正在使用DefaultTableModel中的removeRow(...)
方法。
如果要在删除之前跟踪行,则需要重写removeRow(...)
方法并在删除之前跟踪数据。
或者,如果您使用其他自定义TableModel,则将需要重写删除行的方法。
我处理此问题的方法是,强迫用户标记该行内的复选框(该列标记为“删除”),然后添加一个按钮或右键单击菜单选项来执行删除事件。 关键是,触发了执行动作的事件,并且在该调用中,我找出了选择的行,检索了数据,然后进行下一步,最后一步是删除该行。
-----编辑-------
您还需要实现自己的Abstract表模型实现,以便可以实现以上内容。 我实际上没有使用DefaultTableModel进行任何认真的编码,主要是因为删除了许多控件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.