gpt4 book ai didi

java - 如何将 DefaultTableModel 对象的数据放入 DefaultTableModel 的子类中

转载 作者:行者123 更新时间:2023-12-02 10:01:03 25 4
gpt4 key购买 nike

我有一个 jTable,显示一个简单的两列 SQL 表的数据并允许用户维护该列表。这是我的第一个java程序。使其正常工作,以便用户可以编辑数据列表并按“保存”进行更新。我从这行代码获取 jTable 的 DefaultTableModel 的 sql 数据:

paCutAboveTable.SetTableModel((DefaultTableModel) DbUtils.resultSetToTableModel(rs));

我猜这里的人很熟悉 DBUtils 和 resultSets。我想在每一行添加一个复选框。在这里和其他地方我一直看到子类 DefaultTableModel 以便重写方法:

/*

* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/

public Class getColumnClass(int c) {

return getValueAt(0, c).getClass();
}

但是,我无法弄清楚如何从 resultSetToTableModel 方法获取 DefaultTableModel 的输出到我的子类 - 如果将 SetTableModel 方法更改为接受子类作为其参数,则显示的语句不会编译。有没有一种简单的方法让我失踪?

最佳答案

以下示例展示了如何从 ResultSet 读取数据并在您自己的自定义 DefaultTableModel 中实现 getColumnClass(...) 方法:

import java.awt.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableFromDatabase extends JFrame
{
public TableFromDatabase()
{
Vector<Object> columnNames = new Vector<Object>();
Vector<Object> data = new Vector<Object>();

try
{
// Connect to an Access Database

String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
// String url = "jdbc:odbc:???"; // if using ODBC Data Source name
String url =
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/directory/???.mdb";
String userid = "";
String password = "";

Class.forName( driver );
Connection connection = DriverManager.getConnection( url, userid, password );

// Read data from a table

String sql = "Select * from ???";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( sql );
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();

// Get column names

for (int i = 1; i <= columns; i++)
{
columnNames.addElement( md.getColumnLabel(i) );
}

// Get row data

while (rs.next())
{
Vector<Object> row = new Vector<Object>(columns);

for (int i = 1; i <= columns; i++)
{
row.addElement( rs.getObject(i) );
}

data.addElement( row );
}

rs.close();
stmt.close();
connection.close();
}
catch(Exception e)
{
System.out.println( e );
}

// Create table with database data

DefaultTableModel model = new DefaultTableModel(data, columnNames)
{
@Override
public Class getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);

if (o != null)
{
return o.getClass();
}
}

return Object.class;
}
};

JTable table = new JTable( model );
JScrollPane scrollPane = new JScrollPane( table );
add( scrollPane );

JPanel buttonPanel = new JPanel();
add( buttonPanel, BorderLayout.SOUTH );
}

public static void main(String[] args)
{
TableFromDatabase frame = new TableFromDatabase();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
}
}

通过覆盖 getColumnClass(...) 方法,您现在将看到格式为右对齐的数字,如果您需要对数据进行排序,它将正常工作,因为该列将根据数值不是字符串值。

I want to add a CheckBox to each row.

所以现在你有两个选择:

  1. 修改上述代码,以便“columnNames” vector 包含复选框列的另一个标题名称,并在迭代 ResultSet 时将 Boolean.FALSE 添加到每个“row” vector .

  2. 按原样使用上述 TableModel(或使用 DbUtils TableModel),然后创建一个包装器 TableModel,它将向任何现有 TableModel 添加复选框列。查看:How to add checkbox in Jtable populated using rs2xml有关此方法的示例。

关于java - 如何将 DefaultTableModel 对象的数据放入 DefaultTableModel 的子类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55627828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com