JTable设置模型并保留列格式(宽度,对齐等)

时间:2012-03-07 10:12:33

标签: java swing netbeans jtable model-binding

这是JTable绑定的大脑破解体验。这就是我做的。我创建了一个JTable,其列设置为指定的宽度,使用renderers对其进行格式化,并在其上添加了一些代码。 但是当我尝试将其绑定到模型时,所有列都被模型的字段 替换。有没有办法如何正确绑定它?

我正在避免循环,因为数据库中有超过100条记录。我正在尝试使用其他方法,例如BeansBindingEntityManager,但我不知道如何更改数据源(这就是为什么我选择将其绑定到模型)因为我正在测试它到备份数据库,很快就会实现到新服务器。

这就是我在.Net中所做的,我通常创建一个datagridview并将其绑定到数据集,它工作正常。但我无法将其应用于java。我需要你的意见,我怎么能在java中做到这一点,可以处理超过100万条记录。

    PreparedStatement pst = conn.prepareStatement("SQL Query here");
    ResultSet rs = pst.ExecuteQuery();
    jTable1.setModel(DbUtils.resultSetToTableModel(rs));

上面的代码运行正常,但我在这方面的一个非常大的问题是它会覆盖模型中的列格式化的列。

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:2)

太宽泛的问题

1)从来没有,真的从来没有把100+ thousand records放到视图中,这对所有编程语言都有效,真的没用了

2)(我的观点)BeansBindings是out_dated使用标准的TableModel而不是

3)没有更好的@camickr TableFromDatabase或其他建议正在搜索ResultSetTableModel

答案 1 :(得分:2)

根据评论,您可以尝试将以下方法添加到DbUtils:

public static void updateTableModelData(DefaultTableModel tModel, ResultSet rs) 
        throws Exception {
    tModel.setRowCount(0);
    ResultSetMetaData metaData = rs.getMetaData();

    while (rs.next()) {
        Vector newRow = new Vector();
        for (int i = 1; i <= numberOfColumns; i++) {
            newRow.addElement(rs.getObject(i));
        }
        tModel.addRow(newRow);
    }
}

然后你的代码就变成了:

PreparedStatement pst = conn.prepareStatement("SQL Query here");
ResultSet rs = pst.ExecuteQuery();
DbUtils.updateTableModelData((DefaultTableModel) jTable1.getModel(), rs);

答案 2 :(得分:0)

我发现您可以创建格式化方法并在try块之后调用它,如下所示。

 private void UpdateTable() throws SQLException {
     String sql = "select * from invoice";
    proDialog.setValue(10);
    table.setShowHorizontalLines(true);
    table.setShowVerticalLines(true);
    proDialog.setValue(20);
    try (
        PreparedStatement pst = con.prepareStatement(sql);

          ResultSet rs = pst.executeQuery();

            )
            {           
        table.setModel(DbUtils.resultSetToTableModel(rs));          
    } catch (Exception e) {
         JOptionPane.showMessageDialog(null, e);
    }
    format();       
}

public void format() {
TableColumnModel m = table.getColumnModel();
m.getColumn(2).setCellRenderer(FormatRenderer.getDateTimeRenderer());
m.getColumn(1).setCellRenderer(FormatRenderer.getTimeRenderer());
m.getColumn(2).setCellRenderer(NumberRenderer.getPercentRenderer());
m.getColumn(4).setCellRenderer(NumberRenderer.getCurrencyRenderer());
m.getColumn(4).setCellRenderer(NumberRenderer.getPercentRenderer());
m.getColumn(5).setCellRenderer(NumberRenderer.getCurrencyRenderer());
}

这将完美地运作