【发布时间】:2019-12-16 15:09:06
【问题描述】:
晚上好,
我有一个 JTable,其中包含来自 SQL 表的数据。我在 SQL 表中有一个包含十进制值的列(例如,44.44),但在 JTable 中它显示为 44.00。所以不知何故,JTable(或输入字段)将值四舍五入到最接近的整数(这是我不想要的)。
我尝试使用 Table Renderer,但它没有给我想要的结果(或者我忽略了一些东西)
表格渲染器代码:
static class DecimalFormatRenderer extends DefaultTableCellRenderer {
private static final DecimalFormat formatter = new DecimalFormat( "#,###.00" );
public Component getTableCellRendererComponent(
JTable pickTable, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
Number number = (Number) value;
value = formatter.format((Number)value);
return super.getTableCellRendererComponent(
pickTable, value, isSelected, hasFocus, row, column );
}
}
此代码将 SQL 表中的日期加载到 JTable 中:
private void LoadPickTable() {
ArrayList<Pick> pick = ListPick(pickFilterTxt1.getText());
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(new Object[]{"ID", "ARTIKELCODE", "LOCATIE", "OMSCHRIJVING", "EENHEID", "CODE","HAL","AANTAL","INITIAAL"});
Object[] rij = new Object[9];
pickTable.setFont(new Font("Barlow", Font.PLAIN, 22));
for (int i = 0; i < pick.size(); i++) {
rij[0] = pick.get(i).getId();
rij[1] = pick.get(i).getArtiekelcode();
rij[2] = pick.get(i).getLocatie();
rij[3] = pick.get(i).getOmschrijving();
rij[4] = pick.get(i).getEenheid();
rij[5] = pick.get(i).getCode();
rij[6] = pick.get(i).getHal();
rij[7] = pick.get(i).getAantal();
rij[8] = pick.get(i).getInitiaal();
model.addRow(rij);
}
pickTable.setModel(model);
pickTable.getColumnModel().getColumn(7).setCellRenderer(new DecimalFormatRenderer());
}
我用来测试的 Input 字段是一个 JComboBox (pickAantalCombo),代码:
private void ModifyPick() {
int row = pickTable.getSelectedRow();
String cell = pickTable.getModel().getValueAt(row, 0).toString();
String sql = "UPDATE PICKLOCATIES SET artikelcode=?,locatie=?,omschrijving=?, eenheid=?, hal=?, aantal=?, initiaal=? WHERE ID=" + cell;
try {
conn = getConnection();
pst = conn.prepareStatement(sql);
String code = (String) pickArticleCombo.getSelectedItem();
pst.setString(1, code);
String loc = (String) pickLocationCombo.getSelectedItem();
String hal = (String) halCombo.getSelectedItem();
String decimal = (String) pickAantalCombo.getSelectedItem();
pst.setString(1, code);
pst.setString(2, loc);
pst.setString(3, pickDescriptionTxt.getText());
pst.setString(4, eenheidTxt.getText());
pst.setString(5, hal);
pst.setString(6,decimal);
pst.setString(7, pickInitiaalTxt.getText());
pst.executeUpdate();
LoadPickTable();
ClearPickFields();
JOptionPane.showMessageDialog(null, "Artikel Aangepast!");
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
JTable 的屏幕截图:
SQL 表的屏幕截图:
输入字段中的输入值当然是44.44。
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
类
Pick中的getAantal()方法的返回类型是什么? -
它出现在您的
DecimalFormatRenderer类中,您正在将值转换为数字Number number = (Number) value;,仅此一项就会从您的值中删除小数点,将变量编号保留为 44,并且当您应用格式化程序时, 你得到 44.00 -
@Cujoey Casting 不会更改对象。如果之前是 Double、Float 或 BigDecimal,则强制转换不会改变这一事实。