0

モデルとして、モデル自体の基になるデータとしてJTablewithを使用しているため、JTable はこのリストに格納されているデータを表示しています。DefaultTableModelDefaultListModel

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 の変更をリッスンしていますが、これでは十分ではありません。

4

2 に答える 2

1

その機能を自分で管理しない限り、モデルから削除されたデータを取得する方法はありません。

おそらくremoveRow(...)、DefaultTableModel のメソッドを使用しています。

removeRow(...)削除される前に行を追跡する場合は、メソッドをオーバーライドして、削除される前にデータを追跡する必要があります。

または、他のカスタム TableModel を使用している場合は、行を削除するメソッドをオーバーライドする必要があります。

于 2014-03-18T15:38:20.030 に答える