首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将DefaultTableModel对象的数据转换为DefaultTableModel的子类

如何将DefaultTableModel对象的数据转换为DefaultTableModel的子类
EN

Stack Overflow用户
提问于 2019-04-11 08:20:00
回答 1查看 1.1K关注 0票数 0

我有一个jTable,它显示一个简单的两列sql表的数据,并允许用户维护这个列表。这是我的第一个java程序。让用户可以编辑数据列表并按“保存以更新”。我从这一行代码中将sql数据发送到jTable的DefaultTableModel:

代码语言:javascript
复制
paCutAboveTable.SetTableModel((DefaultTableModel) DbUtils.resultSetToTableModel(rs));

我猜这里的人都很熟悉DBUtils和resultSets。我想在每一行中添加一个CheckBox。在这里和其他地方,我一直看到子类DefaultTableModel,这样就可以覆盖一个方法:

代码语言:javascript
复制
/*

  * 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();
   }

但是,我不知道如何将DefaultTableModel的输出从resultSetToTableModel方法获得到子类--如果将SetTableModel方法更改为接受子类作为其参数,则显示的语句不会编译。我错过了什么简单的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-11 14:31:26

下面是一个示例,演示如何从ResultSet读取数据并在您自己的自定义DefaultTableModel中实现getColumnClass(...)方法:

代码语言:javascript
复制
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。

现在你有两个选择:

  1. 修改上面的代码,以便"columnNames“向量包含复选框列的另一个标题名称,并在遍历ResultSet时向每个”行“向量添加Boolean.FALSE
  2. 按原样使用上面的TableModel (或使用DbUtils TableModel),然后创建一个包装器TableModel,它将向任何现有的TableModel添加复选框列。有关此方法的示例,请查看:How to add checkbox in Jtable populated using rs2xml
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55627828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档