Java 在JTable中简单显示数据库数据

Java 在JTable中简单显示数据库数据,java,database,swing,jdbc,Java,Database,Swing,Jdbc,我有一个结构简单的JTable,我想用数据库数据填充它 我写了这段代码,但现在不知道如何继续 任何愚蠢到包含一个空的捕捉块的人肯定会挣扎: } catch (SQLException ex) { } 这是一个非常糟糕的主意。您应该至少记录或打印堆栈跟踪,或者向方法签名添加一个throws子句,并在其他地方处理它 你的代码风格也很差。可读性很重要。形成一种连贯的风格并坚持下去 在JTable中简单显示数据库数据 无需创建自定义TableModel 有关将数据加载到DefaultTable

我有一个结构简单的
JTable
,我想用数据库数据填充它


我写了这段代码,但现在不知道如何继续

任何愚蠢到包含一个空的捕捉块的人肯定会挣扎:

} catch (SQLException ex) {
    }
这是一个非常糟糕的主意。您应该至少记录或打印堆栈跟踪,或者向方法签名添加一个throws子句,并在其他地方处理它

你的代码风格也很差。可读性很重要。形成一种连贯的风格并坚持下去

在JTable中简单显示数据库数据

无需创建自定义TableModel


有关将数据加载到DefaultTableModel并在JTable中显示模型的简单方法,请参见数据库示例中的
表。

此异常是因为cols变量未在任何地方初始化

所以您应该初始化TableModels构造函数或out of TableModel中的所有字段

那么,您不应该在TableModels的主要方法中使用元数据或任何类型的数据库

仅在构造函数中或表模型的外侧

像这样。尝试:

class d9tableModel extends AbstractTableModel {

Connection con;
Statement statement;
ResultSetMetaData metadata;
ResultSet resultSet;
String dbName = "mydb";
String bdUser = "root";
String dbPassword = "2323";
String dbUrl = "jdbc:mysql://localhost/mydb";
String query = "select * from mytable";
ArrayList<String> cols = new ArrayList<>();
ArrayList<ArrayList<String>> data = new ArrayList<>();

public d9tableModel() {

    try {
        con = DriverManager.getConnection(dbUrl, bdUser, dbPassword);
        System.out.println("Connected to database successfully!");
        statement = con.createStatement();
        resultSet = statement.executeQuery(query);

        int c = resultSet.getMetaData().getColumnCount();
        for (int i = 0; i < c; i++) {
            cols.add(resultSet.getMetaData().getColumnName(i));
        }

        while (resultSet.next()) {
            ArrayList<String> row = new ArrayList<>();
            for (int i = 0; i < c; i++) {
                row.add(resultSet.getString(i));
            }
            data.add(row);
        }
    } catch (SQLException ex) {
        System.out.println("Could not connect to database");
    } finally {
        try {
            if (statement != null) {
                statement.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(d9tableModel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

@Override
public int getRowCount() {
    return data.size();
}

@Override
public int getColumnCount() {
    return cols.size();
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    ArrayList<String> row = data.get(rowIndex);
    return row.get(columnIndex);
}

@Override
public String getColumnName(int column) {
    return cols.get(column);
}}
类d9tableModel扩展了AbstractTableModel{ 连接con; 声明; 结果元数据; 结果集结果集; 字符串dbName=“mydb”; 字符串bdUser=“root”; 字符串dbPassword=“2323”; String dbUrl=“jdbc:mysql://localhost/mydb"; String query=“从mytable中选择*”; ArrayList cols=新的ArrayList(); ArrayList数据=新的ArrayList(); 公共d9tableModel(){ 试一试{ con=DriverManager.getConnection(dbUrl、bdUser、dbPassword); System.out.println(“成功连接到数据库!”); statement=con.createStatement(); resultSet=语句.executeQuery(查询); int c=resultSet.getMetaData().getColumnCount(); 对于(int i=0;i
这个表模型精确地映射了JTable中的数据库表

对不起,我的英语很差


祝你好运。

到目前为止你面临的问题是什么?正如我所看到的,您从不修改数据[]和cols[]数组,它们是空的,因此您可能会遇到一些异常,或者您的表是空的。您是否有任何具体问题,或者您只是想学习如何使用JTable?如果后一种说法是正确的,那么网上有很多教程,你可以参考。你可能想看看我认为你在一节课上做的太多了。将问题分解为可以单独测试的部分。在您担心Swing或UI之前,先让数据库工作起来。这是一个坏主意。您如何知道预期的行数?可能是阵列溢出了。同样,您可能会使数组下溢,留下大量空行。使用一种类型的
列表
。如果我可以避免的话,它也不愿意在表中混合我的数据库逻辑……但那只是我;)我需要创建一个自定义的TableMode,如下所示。我认为我的主要问题是将数据发送到数组或向量,然后创建表模型。camickr是Swing专家。当他告诉你一个DefaultTableModel已经足够时,你应该仔细听并尝试一下。@kleopatra我运行了这段代码,只显示了第一列!将
i<=c
添加到循环后,问题解决了@Sajjad,您正确地发现了错误,基本问题是您没有完全修复它:只调整上限,而不是下限:-)Omid,结果集中的索引是基于1的,而不是基于0的,您需要适当地编辑和修复循环。