【问题标题】:How to Insert row data from database into specific columns of a JTable?如何将数据库中的行数据插入到 JTable 的特定列中?
【发布时间】:2015-11-03 23:25:03
【问题描述】:

我编写了一个管理 MySQL 数据库的 GUI Java 程序。用户选择他/她想要填充 JTable 的列(将从数据库中选择哪些表和列)。

我对 JTable 的列名进行了硬编码,因此即使用户选择仅显示来自列子集的数据,所有列名都将可见。

问题是,当用户以不同于我的 JTable 预期的顺序选择列时,数据会显示在错误的列中。这有点难以解释,所以这里是加载到长度列:

tableGenerator 类:

package gui;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;

public class TableGenerator
{

    private ArrayList columnNames = new ArrayList();
    private ArrayList data = new ArrayList();
    private Vector columnNamesVector = new Vector();
    private Vector dataVector = new Vector();
    private int columns = 0;
    private int rows = 0;

    @SuppressWarnings("unchecked")
    public TableGenerator(ResultSet rs)
    {
        try{
            ResultSetMetaData md = rs.getMetaData();
            columns = md.getColumnCount();
            //  Get column names

                columnNames.add("Title");
                columnNames.add("Year");
                columnNames.add("Length");
                columnNames.add("Genre");
                columnNames.add("Actor");
                columnNames.add("Producer");
                columnNames.add("Director");
                columnNames.add("Writer");

            //  Get row data
            while (rs.next())
            {
                ArrayList row = new ArrayList(columnNames.size());

                for (int i = 1; i <= columns; i++)
                {
                        row.add(rs.getObject(i));
                }
                data.add( row );
                rows++;
            }
        }
        catch (SQLException e)
        {
            System.out.println( e.getMessage() );
        }

        // Create Vectors and copy over elements from ArrayLists to them
        // Vector is deprecated but I am using them in this example to keep 
        // things simple - the best practice would be to create a custom defined
        // class which inherits from the AbstractTableModel class


        for (int i = 0; i < data.size(); i++)
        {
            ArrayList subArray = (ArrayList)data.get(i);
            Vector subVector = new Vector();
            for (int j = 0; j < subArray.size(); j++)
            {
                subVector.add(subArray.get(j));
            }
            dataVector.add(subVector);
        }

        for (int i = 0; i < columnNames.size(); i++ )
            columnNamesVector.add(columnNames.get(i));
        }

    public Vector getColumns(){
        return columnNamesVector;
    }
    public Vector getData(){
        return dataVector;
    }
    public ArrayList getColumnNames(){
        return columnNames;
    }
    public int getNumberOfRows(){
        return rows;
    }

}

我正在使用经过一些修改的 DefaultTableModel.. :

model = new DefaultTableModel(rows, columns){

    private static final long serialVersionUID = 1L;

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }

    @Override
    public Class<?> getColumnClass(int column) {
        if (column < classes.length) 
            return classes[column];
        return super.getColumnClass(column);

    };};

【问题讨论】:

  • 如果这是我的代码,我会通过不对列名进行硬编码来解决它。你没有向我们展示你的表模型类,我认为这将是解决这个困境的关键。
  • 我使用 DefaultTableModel 进行了一些修改,以启用整数排序并禁用编辑,将其添加到问题中。

标签: java swing jtable


【解决方案1】:

您的查询应始终返回所有列的数据。这意味着数据将以相同的方式存储在 TableModel 中。

然后您可以更改要显示的列的视图。也就是说,您可以从TableColumnModelJTable 中删除TableColumns,并且只显示用户想要查看的数据,即使它在模型中仍然可用。然后意味着用户可以随时点击任何复选框,您不需要重新进行数据库查询,只需将 TableColumn 添加回表中即可。

查看Table Column Manager 以获取此方法的示例。此类使用弹出菜单来管理列,但您仍然可以使用复选框。您只需要调用TableColumnManager 的适当方法来隐藏/显示列。也就是说,假设复选框的标签与表格中的标题匹配,您可以只使用复选框文本来隐藏/显示列。

另一种方法是不对列名进行硬编码(如果您构建查询以仅获取特定列),而是从 ResultSet 的元数据中获取列名。 Table From Database 中的 TableFromDatabaseExample.java 显示了如何做到这一点。代码是通用的,因此可以为日期、整数等使用适当的渲染器。

【讨论】:

  • 好的,我会检查表列管理器,谢谢 :) 我之前没有对列名进行硬编码,它工作得很好。问题是当我编辑表格并将数据保存到数据库时..因为那时我需要 WHERE 语句中其他字段的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2022-11-30
  • 2014-08-08
相关资源
最近更新 更多