Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将数据库中的行数据插入JTable的特定列中?_Java_Swing_Jtable - Fatal编程技术网

Java 如何将数据库中的行数据插入JTable的特定列中?

Java 如何将数据库中的行数据插入JTable的特定列中?,java,swing,jtable,Java,Swing,Jtable,我已经编写了一个GUI Java程序来管理MySQL数据库。用户选择要填充JTable的列(将从数据库中选择哪些表和列) 我硬编码了JTable的列名,因此即使用户选择只显示列子集中的数据,所有列名都将可见 问题是,当用户选择的列的顺序与我的JTable预期的不同时,数据会显示在错误的列中。。这有点难以解释,因此下面是加载到“长度”列中的流派数据的屏幕截图: 表格生成器类: package gui; import java.sql.ResultSet; import java.sql.Resu

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

我硬编码了JTable的列名,因此即使用户选择只显示列子集中的数据,所有列名都将可见

问题是,当用户选择的列的顺序与我的JTable预期的不同时,数据会显示在错误的列中。。这有点难以解释,因此下面是加载到“长度”列中的流派数据的屏幕截图:

表格生成器类:

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;
    }

}
packagegui;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.sql.SQLException;
导入java.util.ArrayList;
导入java.util.Vector;
公共类表格生成器
{
私有ArrayList columnNames=新ArrayList();
private ArrayList data=new ArrayList();
私有向量columnNamesVector=新向量();
私有向量数据向量=新向量();
私有int列=0;
私有int行=0;
@抑制警告(“未选中”)
公共表生成器(结果集rs)
{
试一试{
ResultSetMetaData md=rs.getMetaData();
columns=md.getColumnCount();
//获取列名
列名称。添加(“标题”);
列名称。添加(“年度”);
列名称。添加(“长度”);
专栏名称。添加(“流派”);
columnNames.add(“参与者”);
列名。添加(“制作人”);
列名。添加(“董事”);
专栏名称。添加(“作者”);
//获取行数据
while(rs.next())
{
ArrayList行=新的ArrayList(columnNames.size());

对于(int i=1;i,您的查询应始终返回所有列的数据。这意味着数据将以相同的方式存储在TableModel中

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

查看此方法的一个示例。此类使用弹出菜单来管理列,但您仍然可以使用复选框。您只需调用
TableColumnManager
的相应方法来隐藏/显示列。也就是说,假设复选框的标签与表中的标题匹配,则只需使用选中用于隐藏/显示列的文本框


另一种方法是不硬编码列名(如果您构建查询只获取特定列)而是从结果集的元数据中获取列名。
TableFromDatabaseExample.java
from展示了如何做到这一点。该代码是通用的,以便对日期、整数等使用适当的呈现器。

如果这是我的代码,我会通过不硬编码列名来解决它。您没有向我们展示您的表模型class,我相信这是解决这个难题的关键。我正在使用DefaultTableModel,并做了一些修改,以启用整数排序和禁用编辑,将其添加到问题中。好的,我将查看表列管理器,谢谢:)我以前没有对列名进行硬编码,它工作得很好。问题是,当我编辑表并将数据保存到数据库时..因为那时我需要WHERE语句中其他字段的数据。
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);

    };};