如何用我的嵌入式数据库填充我的 JTable?
How can I populate my JTable with my embedded database?
我在 GUI 应用程序中显示填充了数据库的 JTable 时遇到问题。
我的代码在 运行 之后创建了一个带有面板的 GUI,然后我创建了我的 JTable 并将其添加到我的应用程序中。然后我 运行 通过一种据称填充 table 的方法。填充完成后,没有任何显示。
剖析我的代码,我被引导相信某个地方导致数据无法解析到我的 table,出于某种未知原因,这就是我来到这里的原因。
点击一个按钮,这段代码包含:
JTable tigerTable = new JTable();
JPanel centerPanel = new JPanel();
centerPanel.add(tigerTable, new GridBagConstraints());
FillTable(tigerTable, "SELECT * FROM TIGER_INFO");
FillTable方法如下:
//Add buildTableModel method
public void FillTable(JTable table, String Query)
{
try
{
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:derby:STOCK_CONTROL");
Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stat.executeQuery(Query);
System.out.println("Connected");
//Remove previously added rows
while (table.getRowCount() > 0)
{
((DefaultTableModel) table.getModel()).removeRow(0);
}
int columns = rs.getMetaData().getColumnCount();
while (rs.next())
{
Object[] row = new Object[columns];
for (int i = 1; i <= columns; i++)
{
row[i - 1] = rs.getObject(i);
}
((DefaultTableModel) table.getModel()).insertRow(rs.getRow() - 1, row);
}
rs.close();
stat.close();
conn.close();
}
catch (InstantiationException |
IllegalAccessException |
ClassNotFoundException |
SQLException e)
{
System.out.println(e);
e.printStackTrace();
}
}
这样做会创建应用程序,但不会显示任何 table 数据。我的数据库包含 3 列和 3 行,但我没有看到我的数据显示在 JTable 中。
我的问题是,如何使用我的数据库填充我的 JTable 并在我的 GUI 应用程序上正确显示它?
如果您还需要什么,请告诉我,我会尽量提供。
提前致谢。
我觉得你混合操作,我建议使用这个指令:
- 创建一个 Bean 或 Entity 来存储您的对象的信息
- 获取您的数据列表,
- 在 JTable 中显示数据,
因此您可以使用它在 JTable 中显示数据:
....
List<TIGER_INFO> list = new ArrayList<>();//create a List of data
while (rs.next()){
//fill data in your List
list.add(new TIGER_INFO(rs.getTYPExxx("att1"), rs.getTYPExxx("att2"), rs.getTYPExxx("att3"));
}
//when you finish call your function which display your data :
fillData(list);
....
填写日期的方法可以是这样的:
private void fillData(List<TIGER_INFO> list) {
DefaultTableModel model = (DefaultTableModel) jTableName.getModel();
while (model.getRowCount() > 0) {
for (int i = 0; i < model.getRowCount(); i++) {
model.removeRow(i);
}
}
for (TIGER_INFO obj : list) {
model.addRow(new Object[]{
obj.getAttribute1(),
obj.getAttribute2,
obj.getAttribute3
});
}
}
我建议写一个 class 扩展 AbstractTableModel。在此class 中添加一个函数,根据SQL-语句填充内容。然后它看起来像:
TigerTableModel tigerModel = new TigerTableModel(dbConnection);
tigerModel.executeQuery("select * FROM TIGER_INFO");
JTable tigerTable = new JTable(tigerModel);
或者您创建一个能够 运行 每个 SQL 语句的通用 TableModel,因此您在项目中非常灵活。
我找到了解决方案 - 我一直在努力解决这个问题太久了,我终于解决了它。
先尝试手动设置 table 模型。
JTable tigerTable = new JTable();
tigerTable.setModel(new DefaultTableModel(0, numberOfColumns));
当您不指定模型时,JTable 会创建一个匿名内部 class,并且通常不会按您希望的方式运行。
我在 GUI 应用程序中显示填充了数据库的 JTable 时遇到问题。
我的代码在 运行 之后创建了一个带有面板的 GUI,然后我创建了我的 JTable 并将其添加到我的应用程序中。然后我 运行 通过一种据称填充 table 的方法。填充完成后,没有任何显示。
剖析我的代码,我被引导相信某个地方导致数据无法解析到我的 table,出于某种未知原因,这就是我来到这里的原因。
点击一个按钮,这段代码包含:
JTable tigerTable = new JTable();
JPanel centerPanel = new JPanel();
centerPanel.add(tigerTable, new GridBagConstraints());
FillTable(tigerTable, "SELECT * FROM TIGER_INFO");
FillTable方法如下:
//Add buildTableModel method
public void FillTable(JTable table, String Query)
{
try
{
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:derby:STOCK_CONTROL");
Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stat.executeQuery(Query);
System.out.println("Connected");
//Remove previously added rows
while (table.getRowCount() > 0)
{
((DefaultTableModel) table.getModel()).removeRow(0);
}
int columns = rs.getMetaData().getColumnCount();
while (rs.next())
{
Object[] row = new Object[columns];
for (int i = 1; i <= columns; i++)
{
row[i - 1] = rs.getObject(i);
}
((DefaultTableModel) table.getModel()).insertRow(rs.getRow() - 1, row);
}
rs.close();
stat.close();
conn.close();
}
catch (InstantiationException |
IllegalAccessException |
ClassNotFoundException |
SQLException e)
{
System.out.println(e);
e.printStackTrace();
}
}
这样做会创建应用程序,但不会显示任何 table 数据。我的数据库包含 3 列和 3 行,但我没有看到我的数据显示在 JTable 中。
我的问题是,如何使用我的数据库填充我的 JTable 并在我的 GUI 应用程序上正确显示它?
如果您还需要什么,请告诉我,我会尽量提供。
提前致谢。
我觉得你混合操作,我建议使用这个指令:
- 创建一个 Bean 或 Entity 来存储您的对象的信息
- 获取您的数据列表,
- 在 JTable 中显示数据,
因此您可以使用它在 JTable 中显示数据:
....
List<TIGER_INFO> list = new ArrayList<>();//create a List of data
while (rs.next()){
//fill data in your List
list.add(new TIGER_INFO(rs.getTYPExxx("att1"), rs.getTYPExxx("att2"), rs.getTYPExxx("att3"));
}
//when you finish call your function which display your data :
fillData(list);
....
填写日期的方法可以是这样的:
private void fillData(List<TIGER_INFO> list) {
DefaultTableModel model = (DefaultTableModel) jTableName.getModel();
while (model.getRowCount() > 0) {
for (int i = 0; i < model.getRowCount(); i++) {
model.removeRow(i);
}
}
for (TIGER_INFO obj : list) {
model.addRow(new Object[]{
obj.getAttribute1(),
obj.getAttribute2,
obj.getAttribute3
});
}
}
我建议写一个 class 扩展 AbstractTableModel。在此class 中添加一个函数,根据SQL-语句填充内容。然后它看起来像:
TigerTableModel tigerModel = new TigerTableModel(dbConnection);
tigerModel.executeQuery("select * FROM TIGER_INFO");
JTable tigerTable = new JTable(tigerModel);
或者您创建一个能够 运行 每个 SQL 语句的通用 TableModel,因此您在项目中非常灵活。
我找到了解决方案 - 我一直在努力解决这个问题太久了,我终于解决了它。
先尝试手动设置 table 模型。
JTable tigerTable = new JTable();
tigerTable.setModel(new DefaultTableModel(0, numberOfColumns));
当您不指定模型时,JTable 会创建一个匿名内部 class,并且通常不会按您希望的方式运行。