Java:在子 jDialog 中的数据更新后刷新我的 jTable
Java: Refreshing my jTable after data updates in child jDialog
我已经调查了很多关于此的不同问题和答案,但找不到一个似乎有效的。
我是 Java 的新手,但有多种不同语言的经验,到目前为止(根据我正在试验的内容),感觉有点像 VBA 除了必须建立你认为应该已经存在的 actions/functions。我想这只是我自己经验不足造成的。
我正在使用 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 是一个将查询应用于 SQL 语句并返回 ArrayList 的函数。我用 4 列构建我的行,然后删除第一列,因此 'ID' 可用但不可见(此最终操作已通过 testing/experimentation 隔离)。
我有另一个代码区域,当单击一行时会打开一个 jDialog,其中可以更新 MySQL 数据库。
问题
我试图抛出一个函数调用,以便在关闭 jDialog 时 table 数据 'refreshes'。我暂时在 jFrame(jTable 所在的位置)中添加了一个按钮以 test/debug 此函数。
不过,我似乎无法让它工作。我最接近的实现是重新调用 showTasks(false),但这显然只是添加具有更新数据的行,而不是替换数据集。我不是 100% 确定是否删除所有行,然后重新构建它们是 'best practice'.
由于我是 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 调用的,并传递 Table 模型和我要编辑的行的 'ID'。 table 模型存储在 parentTable
.
还有一个 'Save' 按钮和一个 'Cancel' 按钮。我还没有将它们分开,目前 'Save' 就是这样做的(SQL 更新等)。我的 'Cancel' 按钮关闭对话框并刷新 jTable,按照以下功能:
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);
}
}
我不确定你想怎么做,但我会给你一个简单的例子来删除和刷新JTable
也许它对你有帮助。
以下 btnDelete
Jbutton 添加到 JFrame
用于从 table 中删除行:
btnDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int rowIndex = table.getSelectedRow();
if(rowIndex > -1) {
int x = (Integer) table.getModel().getValueAt(rowIndex, 0);
if (conn.removeContact(x) == true) { //here add your own code like removeID
model.removeRow(rowIndex);
lblInfo.setText("Contact deleted successfully.");
model.fireTableDataChanged();
} else {
lblInfo.setText("Cannot remove at this time!");
}
}else {
lblInfo.setText("At first you need select a row with single click!");
return;
}
}
});
以及以下用于以原始方式刷新 table 的代码:
btnRefresh.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int rowCount = model.getRowCount();
for (int i = rowCount - 1; i >= 0; i--) {//remove all rows
model.removeRow(i);
}
lblInfo.setText("Table datas updated successfully.");
for (Person p : conn.readAllContacts()) {//add all row from scratch
model.addRow(new Object[] { p.getId(), p.getName(), p.getLastName(), p.getPhone(), p.getEmail() });
}
}
});
I'm not 100% sure if deleting all the rows, then building them back in is 'best practice'.
是的,这可能是最佳做法。
唯一的其他方法是创建一个全新的 TableModel 并使用 setModel() 方法将其添加到 table。这种方法的问题在于它会重置您可能在 table.
上设置的任何自定义 renderers/editors
从 DefaultTableModel 中删除所有行的最简单方法是使用:
model.setRowCount(0);
我已经调查了很多关于此的不同问题和答案,但找不到一个似乎有效的。
我是 Java 的新手,但有多种不同语言的经验,到目前为止(根据我正在试验的内容),感觉有点像 VBA 除了必须建立你认为应该已经存在的 actions/functions。我想这只是我自己经验不足造成的。
我正在使用 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 是一个将查询应用于 SQL 语句并返回 ArrayList 的函数。我用 4 列构建我的行,然后删除第一列,因此 'ID' 可用但不可见(此最终操作已通过 testing/experimentation 隔离)。
我有另一个代码区域,当单击一行时会打开一个 jDialog,其中可以更新 MySQL 数据库。
问题
我试图抛出一个函数调用,以便在关闭 jDialog 时 table 数据 'refreshes'。我暂时在 jFrame(jTable 所在的位置)中添加了一个按钮以 test/debug 此函数。
不过,我似乎无法让它工作。我最接近的实现是重新调用 showTasks(false),但这显然只是添加具有更新数据的行,而不是替换数据集。我不是 100% 确定是否删除所有行,然后重新构建它们是 'best practice'.
由于我是 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 调用的,并传递 Table 模型和我要编辑的行的 'ID'。 table 模型存储在 parentTable
.
还有一个 'Save' 按钮和一个 'Cancel' 按钮。我还没有将它们分开,目前 'Save' 就是这样做的(SQL 更新等)。我的 'Cancel' 按钮关闭对话框并刷新 jTable,按照以下功能:
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);
}
}
我不确定你想怎么做,但我会给你一个简单的例子来删除和刷新JTable
也许它对你有帮助。
以下 btnDelete
Jbutton 添加到 JFrame
用于从 table 中删除行:
btnDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int rowIndex = table.getSelectedRow();
if(rowIndex > -1) {
int x = (Integer) table.getModel().getValueAt(rowIndex, 0);
if (conn.removeContact(x) == true) { //here add your own code like removeID
model.removeRow(rowIndex);
lblInfo.setText("Contact deleted successfully.");
model.fireTableDataChanged();
} else {
lblInfo.setText("Cannot remove at this time!");
}
}else {
lblInfo.setText("At first you need select a row with single click!");
return;
}
}
});
以及以下用于以原始方式刷新 table 的代码:
btnRefresh.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int rowCount = model.getRowCount();
for (int i = rowCount - 1; i >= 0; i--) {//remove all rows
model.removeRow(i);
}
lblInfo.setText("Table datas updated successfully.");
for (Person p : conn.readAllContacts()) {//add all row from scratch
model.addRow(new Object[] { p.getId(), p.getName(), p.getLastName(), p.getPhone(), p.getEmail() });
}
}
});
I'm not 100% sure if deleting all the rows, then building them back in is 'best practice'.
是的,这可能是最佳做法。
唯一的其他方法是创建一个全新的 TableModel 并使用 setModel() 方法将其添加到 table。这种方法的问题在于它会重置您可能在 table.
上设置的任何自定义 renderers/editors从 DefaultTableModel 中删除所有行的最简单方法是使用:
model.setRowCount(0);