私はこれに関するさまざまな質問と回答を調査しましたが、うまくいくとは思われません。Java:子jDialogのデータ更新後にjTableをリフレッシュする
私はJavaを使い慣れていませんが、さまざまな言語での経験があり、これまでのところ(私が実験していることとの関連で)、アクションを構築しなければならないという点を除けばVBAのようです/あなたはすでにそこにあるはずだと感じている機能。これは、私自身が経験していないことだけではないかと期待しています。
私はNetbeans IDE 8.2とJava Runtime 1.80を使用しています。
jTableを含むjFrameを作成しました。 JTableのはそうのようなデータで構築されています:
public void showTasks(Boolean removeID) {
ArrayList<Tasks> list = tasksList("SELECT * FROM tasks");
JTable table = jTable1;
DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
Object[] row = new Object[4];
for(int i=0;i<list.size();i++) {
row[0]=list.get(i).getId();
row[1]=list.get(i).getName();
row[2]=list.get(i).getDesc();
row[3]=list.get(i).getDate();
model.addRow(row);
}
// Remove the 'id' column from the table view
if(removeID) { table.removeColumn(table.getColumnModel().getColumn(0)); }
}
この背後にある背景にはあまり関係ですが、基本的にtasksListは、ArrayListのを返す、SQL文にクエリを適用する機能です。私は4列の行を構築し、最初の列を削除して 'ID'が利用可能だが可視ではないようにする(この最終アクションはテスト/実験によって分離されている)。
MySQL DBを更新する行がクリックされたときにjDialogを開く別のコード領域があります。
問題
のJDialogを閉じたときに、私はテーブルデータ「リフレッシュ」するように関数呼び出しでスローするようにしようとしています。私はこの機能をテスト/デバッグするためにjFrame(jTableが存在する)にボタンを一時的に追加しました。
私はこれを動作させるようには思えません。私が達成した最も近いのは、showTasks(false)を再呼び出しすることですが、この明白な点は、データセットを置き換えるのではなく、更新されたデータを行に追加するだけです。私は100%確信していないすべての行を削除する場合は、それらを構築する 'ベストプラクティス'です。
私はJavaを使い慣れていて、欠陥のある考え方から見ているかもしれませんが、他の例を自分自身のものに適用することは困難です。私はまた、fireTableDataChanged()
を実装する方法を見つけることができないようです。
確かにこれは私が過度に考えている単純な概念ですか?
編集 - 答え
の下に基づいてすべての行を削除して再度追加することが大丈夫であれば、このようなものは、正しくないと考えられる理由はありますか?
public void refreshTasks() {
DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
int row_total = model.getRowCount();
for(int i= row_total -1;i>=0;i--) {
model.removeRow(i);
}
showTasks(false);
}
編集:ボタンは、次のと今(ない不適切な場合は)正しく動作データ更新
を起動します
private DefaultTableModel parentTable; // To store the parent 'Task' table model
public void setStart(int user,DefaultTableModel table) {
this.txt_taskID.setText(Integer.toString(user)); // Converts the ID to a string
addData(user); // Populates the fields
parentTable = table; // Sets parent TableModel to a variable
}
上記のコードは、親のJFrameから呼び出されたときダイアログが開き、テーブルモデルと編集したい行の「ID」が渡されます。テーブルモデルはparentTable
に格納されています。
「保存」ボタンと「キャンセル」ボタンもあります。私はまだこれらを分離していますが、現在は '保存'だけでそれができます(SQLの更新など)。私はあなたがそれをやりたいかどうかはわかりませんが、私はつもり削除してリフレッシュするためのあなたに簡単な例を与える
private void btn_CancelActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(false); // Hide the dialog
Menu menu = new Menu(); // for accessing the tasksList function
parentTable.setRowCount(0); // Clears the jTable data
// jTable data is then 'rebuilt' using the new data
ArrayList<Tasks> list = menu.tasksList("SELECT * FROM tasks");
Object[] row = new Object[4];
for(int i=0;i<list.size();i++) {
row[0]=list.get(i).getId();
row[1]=list.get(i).getName();
row[2]=list.get(i).getDesc();
row[3]=list.get(i).getDate();
parentTable.addRow(row);
}
}
ありがとう - 間違いなく、現在の行を削除するより効率的な方法です。 何らかの理由で、私はまだjDialogから関数 'refreshTasks'を呼び出すことができません。printlnをデバッグメソッドとして使用することで、呼び出しが正しいことがわかります。テーブルモデルを修正する。 'refreshTasks'関数は、フォーム上のボタンを使用して意図したとおりに動作しますが、jDialogから離れているわけではありません。 –
@ChrisJ、ダイアログを作成するときにTableModelへの参照を渡します。ユーザーが「保存」ボタンをクリックすると、TableModel内のデータが更新されます。テーブル自体が再描画されます。 – camickr
ありがとうございました - 希望通りに動作するように管理し、あなたの提案を使用してコードを更新しました! –