1

JTableデータベースを更新しました。このコードをボタン クリック イベントに関連付けて更新したいのですが、うまくいきません。アプリケーションを閉じて再度開くとJTable、正しいデータが表示されます。

抽象テーブルのメソッドをオーバーライドする必要がありますか?

try {
        model=new MyTableModel(this.database);
        table = new JTable(model);
    } catch (SQLException e) {

        e.printStackTrace();
    }

scrollPane = new JScrollPane(table);

refresh.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {

        ((MyTableModel)table.getModel()).fireTableDataChanged();

    }
});

 class MyTableModel extends AbstractTableModel {
    private int i;
    private String[] columnNames = { "ID", "Code", "Country", "Radio",
            "primljeno", "select" };

    private Object[][] data = { { new Integer(0), "", "", "", "",
            new Boolean(false) } };

    public MyTableModel(My_class_Database database)throws SQLException {
            init(database);


    }
    public void init(My_class_Database database) throws SQLException
    {
        this.i = database.checkIsDataThere();
        Object[][] object;
        if (i == 0) {
            object = new Object[i][7];
            object = database.getDatafromDatabase(this.i);
            this.data = object;
            dataAp = object;

        } else {
            object = database.getDatafromDatabase(this.i);
            textField.setText("No data in database");
        }

    }

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

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

    public Object getValueAt(int row, int col) {
        return data[row][col];

    }

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

    public void setValueAt(Object value, int row, int col) {

        data[row][col] = value;
        fireTableCellUpdated(row, col);

    }

    // problem sa null vrijednostima,null exception
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

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

}
4

2 に答える 2

1

そのまま(投稿されたコード)、モデルはデータベースの変更を認識していません。init()既存のメソッドを呼び出すか、同様のメソッドを作成するなど、モデル内のデータを更新することができます。別の方法として、新しいモデルを作成してテーブルにリセットすることもできます。

fireTableDataChangedで使用するような通知を起動するのは、モデルの責任ですactionPerformed。テーブル クライアントはこれらのメソッドを実行しないでください。 たとえば、メソッドにfireTableDataChanged属します。init()詳細と例については、データ変更イベントの発生を参照してください。

モデルはデータに関するものであるべきなので、設定のロジックをモデルから外した方がよいでしょうtextField。必要に応じて、モデルから追加のメソッドを公開して、クライアントがデータと状態に関する追加の詳細を取得できるようにすることができます。

于 2013-02-26T06:30:03.203 に答える