刷新 java Jtable 以显示更新后的数据
Refreshing the java Jtable to show updated data
每当我查询 mysql 数据库时,我都试图刷新 UI 中显示的 Jtable。这个想法是显示 UI JTable 中更新的任何新数据。
下面是UIclass
public class DBView {
private JFrame frame = new JFrame();
private JScrollPane tableScrollPane = new JScrollPane();
private DefaultTableModel dbTable = new DefaultTableModel();
public void setDbTable(DefaultTableModel dbTable) {
this.dbTable = dbTable;
//this.dbTable.repaint();
paintDBTable();
}
public DefaultTableModel getDbTable() {
return dbTable;
}
public DBView() {
initializeFrame();
paintDBTable();
}
private void paintDBTable() {
tableScrollPane.setBounds(20, 350, 400, 80);
frame.getContentPane().add(tableScrollPane);
JTable DBTable = new JTable(dbTable);
tableScrollPane.add(DBTable);
DBTable.setFillsViewportHeight(true);
tableScrollPane.setViewportView(DBTable);
}
/**
* Initialize the contents of the frame.
*/
private void initializeFrame() {
frame.setVisible(true);
frame.setBounds(100, 100, 451, 525);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
frame.setTitle("MySQL Database");
}
来自另一个模型 class 我正在调用 setDbTable() 方法。我将一个新的 Jtable 对象输入到 setDbTable() 方法,并将从数据库中读取的数据输入到新的 Jtable 对象中。
问题出在 setDbTable() 方法中,我再次使用 paintDBTable() 方法。
我尝试使用 dbTable.fireTableDataChanged() 方法刷新视图,但没有用。
现在的方式,它正在运行。但是使用 setDbTable() 方法来刷新似乎是一种非常低效的方法。
问题是你是否看到我可以使用为刷新 Jtables 定义的另一种方法?
P.S。我对 java 和一般编程还很陌生。如果代码混乱,问题不清楚,请见谅。如果有帮助,我可以提供所有代码。我删除了原始代码中的大部分方法和其他 class 以使问题更清楚。
tableScrollPane.add(DBTable);
JScrollPane isn't designated as container,你必须添加child到JViewport
有两种选择
a) tableScrollPane = new JScrollPane(myTable);
b) tableScrollPane.setViewportView(myTable);
DefaultTableModel dbTable = new DefaultTableModel();
- DefaultTableModel is model that hold value for presentations layer for the JTable
将这个局部变量(即意义所在)重命名为 dbTableModel 而不是 dbTable
您必须创建一个 JTables 视图,f.e。两个基本选项
a) JTable myTable = new JTable(dbTableModel)
b) myTable.setModel(dbTableModel)
dbTable.fireTableDataChanged()
在 DefaultTableModel 中正确实现,不是调用此方法的原因,也不在模型定义之外(class,void,returns 的接口XxxTableModel)
链接的 Oracle 教程中的更多信息,...也适用于 SSCCE/MCVE 形式的工作代码示例
通过
刷新 JTable
的数据
删除 dbTableModel.setRowsCount(0);
中的所有行,然后将新行添加到 dbTableModel.addXxx
re_creating dbTableModel
,注意必须加回 JTable
例如myTable.setModel(dbTableModel)
刷新JTable数据和刷新之后的UI就没有那么混乱了,因为:
Swing 组件以非常棒的方式实现了 MVC 和 Observer。这意味着无论何时更改 TableModel 中的数据,UI 都会收到通知并根据需要重新绘制。
因此,您应该更改代码,使您在 class 中保留 JTable 变量而不是 TableModel 变量。之后在setDbTable
调用JTable的setModel方法,意思是:
public class DBView {
private JTable jtable = new JTable();
public void setDbTable(DefaultTableModel dbTable) {
this.jtable.setModel(dbTable);
//this.dbTable.repaint();
//paintDBTable();
}
.
.
.
}
希望这会有所帮助,
祝你好运。
每当我查询 mysql 数据库时,我都试图刷新 UI 中显示的 Jtable。这个想法是显示 UI JTable 中更新的任何新数据。
下面是UIclass
public class DBView {
private JFrame frame = new JFrame();
private JScrollPane tableScrollPane = new JScrollPane();
private DefaultTableModel dbTable = new DefaultTableModel();
public void setDbTable(DefaultTableModel dbTable) {
this.dbTable = dbTable;
//this.dbTable.repaint();
paintDBTable();
}
public DefaultTableModel getDbTable() {
return dbTable;
}
public DBView() {
initializeFrame();
paintDBTable();
}
private void paintDBTable() {
tableScrollPane.setBounds(20, 350, 400, 80);
frame.getContentPane().add(tableScrollPane);
JTable DBTable = new JTable(dbTable);
tableScrollPane.add(DBTable);
DBTable.setFillsViewportHeight(true);
tableScrollPane.setViewportView(DBTable);
}
/**
* Initialize the contents of the frame.
*/
private void initializeFrame() {
frame.setVisible(true);
frame.setBounds(100, 100, 451, 525);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
frame.setTitle("MySQL Database");
}
来自另一个模型 class 我正在调用 setDbTable() 方法。我将一个新的 Jtable 对象输入到 setDbTable() 方法,并将从数据库中读取的数据输入到新的 Jtable 对象中。
问题出在 setDbTable() 方法中,我再次使用 paintDBTable() 方法。
我尝试使用 dbTable.fireTableDataChanged() 方法刷新视图,但没有用。
现在的方式,它正在运行。但是使用 setDbTable() 方法来刷新似乎是一种非常低效的方法。
问题是你是否看到我可以使用为刷新 Jtables 定义的另一种方法?
P.S。我对 java 和一般编程还很陌生。如果代码混乱,问题不清楚,请见谅。如果有帮助,我可以提供所有代码。我删除了原始代码中的大部分方法和其他 class 以使问题更清楚。
tableScrollPane.add(DBTable);
JScrollPane isn't designated as container,你必须添加child到JViewport
有两种选择
a)
tableScrollPane = new JScrollPane(myTable);
b)
tableScrollPane.setViewportView(myTable);
DefaultTableModel dbTable = new DefaultTableModel();
- DefaultTableModel is model that hold value for presentations layer for the JTable
将这个局部变量(即意义所在)重命名为 dbTableModel 而不是 dbTable
您必须创建一个 JTables 视图,f.e。两个基本选项
a)
JTable myTable = new JTable(dbTableModel)
b)
myTable.setModel(dbTableModel)
dbTable.fireTableDataChanged()
在 DefaultTableModel 中正确实现,不是调用此方法的原因,也不在模型定义之外(class,void,returns 的接口XxxTableModel)链接的 Oracle 教程中的更多信息,...也适用于 SSCCE/MCVE 形式的工作代码示例
通过
刷新JTable
的数据删除
dbTableModel.setRowsCount(0);
中的所有行,然后将新行添加到dbTableModel.addXxx
re_creating
dbTableModel
,注意必须加回JTable
例如myTable.setModel(dbTableModel)
刷新JTable数据和刷新之后的UI就没有那么混乱了,因为:
Swing 组件以非常棒的方式实现了 MVC 和 Observer。这意味着无论何时更改 TableModel 中的数据,UI 都会收到通知并根据需要重新绘制。
因此,您应该更改代码,使您在 class 中保留 JTable 变量而不是 TableModel 变量。之后在setDbTable
调用JTable的setModel方法,意思是:
public class DBView {
private JTable jtable = new JTable();
public void setDbTable(DefaultTableModel dbTable) {
this.jtable.setModel(dbTable);
//this.dbTable.repaint();
//paintDBTable();
}
.
.
.
}
希望这会有所帮助, 祝你好运。