モデルとして、モデル自体の基になるデータとしてJTable
withを使用しているため、JTable はこのリストに格納されているデータを表示しています。DefaultTableModel
DefaultListModel
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();
}
});
}
}
表データ.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 クラスはモデル レベルの一部であり、バックエンドで更新されます。このデータはフロントエンドに表示されますが、対話/編集機能はありません。ただし、ある時点で、アプリケーションはいくつかの変更 (要素の削除など) に対応する必要があります。
TableData の変更が発生する前/発生時に通知を受ける方法はありますか? または、データを表示する方法が正しくないので、他のメカニズムを使用する必要がありますか? (どれ?)
ここに描かれていないもう 1 つの情報: MyTableModel で ListDataListener の実装も使用しているため、TableData の変更をリッスンしていますが、これでは十分ではありません。