JTable 错误的列总和值
Posted
技术标签:
【中文标题】JTable 错误的列总和值【英文标题】:JTable erroneous column summation values 【发布时间】:2015-09-29 15:47:31 【问题描述】:场景 : JTable 包含以下数据,我试图在下图中描述我想要做的事情:-
所以,我想我可以在这里解释我想要实现的目标。
面临的问题 当然,不显示准确的结果(总和)。我使用的代码是:
public void docTotal_Income()
try
int totC=8,xC=3,lC=4,eC=5, sC=6; // totC is the last column, xC-3rd, lC-4th and so on...
for(int i=0;i<(easypath.doctorBusiness_table.getRowCount());i++) // "easypath.doctorBusiness_table" is the table name
sumTot += Double.parseDouble(easypath.doctorBusiness_table.getModel().getValueAt(i, totC).toString());
sumTotx += Double.parseDouble(easypath.doctorBusiness_table.getModel().getValueAt(i, xC).toString());
sumTotl += Double.parseDouble(easypath.doctorBusiness_table.getModel().getValueAt(i, lC).toString());
sumTote += Double.parseDouble(easypath.doctorBusiness_table.getModel().getValueAt(i, eC).toString());
sumTots += Double.parseDouble(easypath.doctorBusiness_table.getModel().getValueAt(i, sC).toString());
easypath.totalEarnt_docBus_tf.setText(String.valueOf(sumTot));
easypath.xTotIncome_tf.setText(String.valueOf(sumTotx));
easypath.lTotIncome_tf.setText(String.valueOf(sumTotl));
easypath.eTotIncome_tf.setText(String.valueOf(sumTote));
easypath.sTotIncome_tf.setText(String.valueOf(sumTots));
sumTot = 0; // public static
sumTotx = 0; // values globally
sumTotl = 0; // declared
sumTote = 0; // and
sumTots = 0; // initialised 0
catch(Exception ex)
ex.printStackTrace();
JOptionPane.showMessageDialog(null, "Error in totalling income");
我在用 Document Listener
精炼 JTable
之后调用方法 docTotal_Income()
(工作正常)并最终触发eventListener
上的 JButton
。
private void jButton6ActionPerformed(java.awt.event.ActionEvent evt)
new doctor().docTotal_Income(); // doctor is the class
在所有这些之后,我得到了不规则的总和。我猜我在逻辑的某个地方出了问题,但我还有什么遗漏的吗?
我很乐意对此提出任何建议。感谢您的宝贵时间
【问题讨论】:
什么是“不规则求和”?你的总数减少了 0.01 吗?减 1,000,000?总数是NaN?无穷大? 不规则并不意味着尺寸或任何错误。我试图解释它给出了错误的求和,5+5 = 20 等等....我猜这是我的 逻辑错误,但我无法指出,所以放整个场景按此顺序 将数字放入 XxxTableModel,覆盖模型定义中的 getColumnClass 【参考方案1】:new doctor().docTotal_Income(); // doctor is the class
首先,类名应以大写字符开头。 “医生()”应该是“医生()”。
你为什么要创建一个新的 Doctor()?
如果您尝试过滤 TableModel 中的数据,那么您需要从表中获取数据,而不是 TableModel。
所以你的代码应该是这样的:
JTable table = easypath.doctorBusiness_table;
for(int i=0; I < table.getRowCount(); i++)
sumTot += Double.parseDouble(table.getValueAt(i, totC).toString());
sumTotx += Double.parseDouble(table.getValueAt(i, xC).toString());
sumTotl += Double.parseDouble(table.getValueAt(i, lC).toString());
sumTote += Double.parseDouble(table.getValueAt(i, eC).toString());
sumTots += Double.parseDouble(table.getValueAt(i, sC).toString());
【讨论】:
这很有魅力,有错误getModel()
,谢谢你提到的其他事情,从长远来看,一定会记住的。 对于 SO 的初学者和像你这样的人 @camickr,学习是如此容易
还有一件事,我正在创建new doctor()....
,因为这是一个不同的类easypath
,我正在调用,我是在做正确的事情还是应该改变一些事情?
我不了解您的设计或您想要做什么。但是,是的,我怀疑单击按钮时没有理由创建新类。如果您正在过滤表的结果,那么您让表过滤行,则无需创建新的 TableModel。阅读关于“如何使用表格”的 Swing 教程以获取过滤示例。
docTotal_income()
属于不同的类,因为有许多模块,我为不同的目的创建了不同的类。因此,为了调用该方法,我为docTotal_income()
创建了一个实例。我知道我还不是专业人士,但是您能指导一下开发多线程或重型应用程序的最佳实践和规范吗?我将非常感激。
是的,您应该使用逻辑类进行设计。我不明白docTotal_income()
是如何工作的。首先,它不遵循 Java 命名约定。描述性词应大写,第一个除外。所以方法应该是docTotalIncome()
。更重要的是,您需要引用 JTable
和 5 JTextFileds
来显示总数。我不明白如何调用 new Doctor() 做到这一点。如果您需要访问这 6 个变量,则应在定义组件并将它们添加到 GUI 的类中定义代码。以上是关于JTable 错误的列总和值的主要内容,如果未能解决你的问题,请参考以下文章
DecisiontreeClassifier,为啥值的总和是错误的?
当我使用 DefaultTableModel 从 CachedRowSet 填充 jTable 时,为啥 JTable 的列标题没有更新?