如何将DefaultTableModel对象的数据放入DefaultTableModel的子类中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将DefaultTableModel对象的数据放入DefaultTableModel的子类中相关的知识,希望对你有一定的参考价值。
我有一个jTable显示一个简单的两列sql表的数据,并允许用户维护列表。这是我的第一个java程序。让它工作,用户可以编辑数据列表,然后按保存更新。我从这行代码中获取sql数据到jTable的DefaultTableModel:
paCutAboveTable.SetTableModel((DefaultTableModel) DbUtils.resultSetToTableModel(rs));
我猜这里有人熟悉DBUtils和resultSets。我想为每一行添加一个CheckBox。在这里和其他地方看,我一直看到子类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(...)
方法,您现在将看到数字格式化为右对齐,如果您需要对数据进行排序,它将正常工作,因为列将根据数值而不是字符串值进行排序。
我想为每一行添加一个CheckBox。
所以现在你有两个选择:
- 修改上面的代码,以便“columnNames”Vector包含复选框列的另一个标题名称,并在迭代ResultSet时将
Boolean.FALSE
添加到每个“row”Vector。 - 按原样使用上面的TableModel(或使用DbUtils TableModel),然后创建一个包装器TableModel,它将向任何现有的TableModel添加一个复选框列。退房:How to add checkbox in Jtable populated using rs2xml以此方法为例。
以上是关于如何将DefaultTableModel对象的数据放入DefaultTableModel的子类中的主要内容,如果未能解决你的问题,请参考以下文章
Java Swing 如何使用DefaultTableModel交替刷新JTable?
应该在哪里定义我的可选 DefaultTableModel 方法?