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环境的新手,这就是为什么我需要这方面的帮助:(