当前位置: 首页 > 知识库问答 >
问题:

如何将DefaultTableModel对象的数据获取到DefaultTableModel的子类中

夹谷晋
2023-03-14

我有一个jTable显示一个简单的两列sql表的数据,并允许用户维护列表。这是我的第一个Java节目。这样用户就可以编辑数据列表并按保存更新。我从以下代码行获取到JTable的DefaultTableModel的sql数据:

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

我猜这里的人对DBUtils和resultset很熟悉。我想为每一行添加一个复选框。在这里和其他地方,我一直注意子类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();
   }

然而,我不知道如何将DefaultTableModel的输出从resultSetToTableModel方法获取到我的子类-如果SetTableModel方法被更改为接受子类作为其参数,则所示语句将无法编译。有什么简单的方法让我错过了吗?

共有1个答案

笪建章
2023-03-14

下面是一个示例,显示如何从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(...)方法,您现在将看到数字的格式是右对齐的,如果您需要对数据排序,它将正常工作,因为列将基于数值而不是字符串值排序。

我想为每一行添加一个复选框。

所以现在您有两个选择:

>

  • 修改上述代码,使“ColumnNames”向量包含复选框列的另一个标头名称,并在遍历ResultSet时向每个“row”向量添加Boolean.false

    按原样使用上面的TableModel(或使用DbUtils TableModel),然后创建一个包装TableModel,该包装TableModel将向任何现有TableModel添加复选框列。查看:如何在使用rs2xml填充的Jtable中添加复选框,以获得此方法的一个示例。

  •  类似资料:
    • 我在将表模型(在模型中)与我的JTable(在视图中)分开时遇到问题,我的模型包含使用方法从数据库获取数据所需的查询: 型号.java View.java 这就是我遇到问题的部分: Controller.java 显然,< code>JTable不能改变它第一次获得的< code>DefaultTbaleModel对象,所以当我执行时,我总是得到一个空的JTable,所以简而言之,我不能在我的<

    • 我想从JTable获取DefaultTableModel,然后添加Column。我在JTable中搜索,但只找到了getModel()方法,然后无法添加列。最后,假设我在JTable中使用Binding方法设置日期,然后没有DefaultTableModel,我想添加列内容JButton添加到我的JTable中。

    • 我正在为学校做一个程序,你可以记录系统剪贴板的历史,我的老师说它是好的,但我需要添加图像。所以我得到了一些图像来表示一个图像,url,文本,或者一个文件夹。但当我尝试.addrow与图像时,它显示的是图像的来源,而不是实际的图像。这是我的课 它实际上显示的是图标而不是源?

    • 我创建了一个DefaultTableModel,它在JTabbedPane中显示了一个非常基本的用户列表。 这是显示和它的好,但谁能指导我使用什么语法来添加行,我已经尝试过: 但这不起作用,eclipse要求我向Statistics类添加一个名为“add row”的方法,但我以为“add row”已经是DefaultTableModel的方法了,所以我很困惑。有没有人能帮助我如何将一行数据添加到表

    • 但仍然无法修复。我的目的是当用户在组合框中选择delete选项时,我只想完全删除该行。顺便说一下,removeRow()方法可以在侦听器外部正常工作。下面是代码和说明: 我是不是漏了什么重要的地方?如有任何帮助,我们将不胜感激。