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

Java JTable设置模型并保留列格式(宽度、对齐方式等),java,swing,netbeans,jtable,model-binding,Java,Swing,Netbeans,Jtable,Model Binding,这是一次使用JTable绑定的大脑崩溃体验。这就是我所做的。我创建了一个JTable,将列设置为指定的宽度,使用renderers对其进行格式化,并在其上添加了一些代码但当我尝试将其绑定到模型时,所有列都被模型的字段替换。有没有办法正确绑定它 我避免循环,因为数据库中有10多万条记录。我正在尝试使用其他方法,如BeansBinding和EntityManager,但我不知道如何更改数据源(这就是为什么我选择将其绑定到模型),因为我正在将其测试为备份数据库,并很快将实现到新服务器 这就是我在.Ne

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

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

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

    PreparedStatement pst = conn.prepareStatement("SQL Query here");
    ResultSet rs = pst.ExecuteQuery();
    jTable1.setModel(DbUtils.resultSetToTableModel(rs));
上面的代码工作得很好,但我在这方面的一个非常大的问题是,它用模型中的列覆盖我的格式化列

请帮我做这个

太宽的问题

1) 从来没有,真的从来没有把
100+000条记录
放到视图中,这对所有编程语言都是有效的,真的没有用

2) (我的观点)BeanSBinding已经过时了,请改用标准的TableModel

3) 没有比@camickr更好的了,或者另一个建议是搜索
resultsetablemodel

太宽的问题

1) 从来没有,真的从来没有把
100+000条记录
放到视图中,这对所有编程语言都是有效的,真的没有用

2) (我的观点)BeanSBinding已经过时了,请改用标准的TableModel


3) 没有比@camickr更好的了,或者另一个建议是搜索
resultsetablemodel

根据评论,您可以尝试向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);
    }
}

根据注释,您可以尝试将以下方法添加到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);
    }
}

我发现你可以创建你的格式化方法并在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());
}

这将非常有效

我发现您可以创建格式化方法,并在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());
}

这将非常有效

数据包是您编写的吗?你自己开发桌子模型了吗?在这种情况下,您可以添加一个setResultSet(rs)方法并触发模型事件来更新表。这可能会保持列的完整性。@dsboger不,实际上我是从这里得到的:它是一个jar文件。您可以创建一个类似于resultSetToTableModel(rs)的方法updateTableModelFromResultSet(tModel,rs),但调用tModel.setDataVector(rows)来更新数据。如果您需要代码方面的帮助,我可以将其转换为答案。我刚刚注意到setDataVector更改了列,因此它可能无法工作。另一种方法是使用tModel.setRowCount(0)清除模型,直接使用tModel.addRow添加行。@dsboger您怎么做?你能给我看看吗?基本上我是java环境新手,这就是为什么我需要这方面的帮助:(DbUtils是您编写的吗?您自己开发了表模型吗?在这种情况下,您可以添加一个setResultSet(rs)方法并触发模型事件来更新表。这可能会保持列的完整性。@dsboger否,实际上我是从这里得到的:它是一个jar文件。您可以创建一个方法updateTableModelFromResultSet(tModel,rs)这与ResultSetTableModel(rs)类似,但调用tModel.setDataVector(行)来更新数据。如果您需要有关代码的帮助,我可以将其转换为答案。我刚刚注意到setDataVector更改了列,因此它可能无法工作。另一种方法是使用tModel.setRowCount(0)清除模型直接使用tModel.addRow添加行。@dsboger您如何做到这一点?您能告诉我吗?基本上我是java环境的新手,这就是为什么我需要这方面的帮助:(