经过一些研究后,我找到了一种方法(如果我理解正确的话,这是一个漫长而乏味的方法......)在我的JTable中实现公式。
这是表格的内容(用netbeans编辑,你可能会说,不要介意大量的空白部分,我们稍后会讨论)
contractFlaminiaTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{"name1", null, null, null, null, null, null, null, null, null, null},
{"name2", null, null, null, null, null, null, null, null, null, null},
{"name3", null, null, null, null, null, null, null, null, null, null},
{"name4", null, null, null, null, null, null, null, null, null, null},
{"name5", null, null, null, null, null, null, null, null, null, null},
{"name6", null, null, null, null, null, null, null, null, null, null},
{"name7", null, null, null, null, null, null, null, null, null, null},
{"name8", null, null, null, null, null, null, null, null, null, null},
{"TOTAL", null, null, null, null, null, null, null, null, null, null}
},
new String [] {
" ", "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9", "TOTAL"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Object.class
};
boolean[] canEdit = new boolean [] {
false, true, true, true, true, true, true, true, true, true, false
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
contractFlaminiaTable.setRowHeight(30);
contractFlaminiaTable.getTableHeader().setReorderingAllowed(false);
flaminiaScrollPane2.setViewportView(contractFlaminiaTable);
contractFlaminiaTable.getColumnModel().getColumn(0).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(1).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(2).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(3).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(4).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(5).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(6).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(7).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(8).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(9).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(10).setResizable(false);
contractFlaminiaTable.getColumnModel().getColumn(10).setPreferredWidth(48);
所以,问题是,在name1 / 2 / etc行和列中应该有数字(而不是netbeans自动生成的空垃圾邮件,我在应用程序中有一个“重置”按钮进行自定义tableModel但这是一个旧版本,在这里没有用处)并且在总行/列中应该有相应列/行中的数字总和。
从我读过的很多线程中,我可以使用getValueAt方法对相应行/列中的单元格求和。我不太确定这是一个不错的选择,但是,由于每次都需要读取大量的单元格(当用户在表格中输入数字时,它应该更新总数,而不是计算我也不知道如何在特定的细胞中实现它。)
以下是问题:
a)是否可以制作类似excel的公式来添加单元格? (比如添加单元格c2:c6,因为我将该表导出到excel文件中,我认为如果有人这样甚至可能......)
2a)我是否必须将列类型更改为对象,否则所述公式仍将被视为整数? (除了作为String类型实现的名称列之外,所有其他列都是Integer类型,最终用户也应该只能插入数字而不是弄乱公式,但是将类型更改为Object实际上可以使也插入字母)
b)是否可以在表格上使用eventListeners制作一个非类似excel的公式(如果不可能的话)? (类似“行(x),col(y)内的数据更改,用总和更新总单元格!”)
c)由于表中的数据被导出到xls文件(在另一个线程中获得几个指针后已经正确实现),是否可以使用所述文件来填充表我或者每次都要重新涂一次吗?
我很遗憾一起提出所有这些问题(尤其是c-因为它与标题无关......)但是我没有在oracle提供的jTable类教程中找到任何内容,也没有在其他方面找到任何建设性意见类似的线程。
请耐心等待,正如另一个帖子中所述,我仍然是初学者(如果我可以被认为是那个!),也提前感谢帮助,另一个指针确实帮助了我! / p> PS:我希望我以一种可以理解的方式解释它,对编程世界不熟悉,当你必须解释东西时,这并不容易。
再次感谢提前帮助〜
修改
这是我在表格中实现公式的代码(实际上它是get / setValueAt()的一个奇怪的用法,但它似乎工作得相当好(有点笨拙,但有改进的空间只是让我学到更多的东西在一天结束时总是很好)
class TotalButton {
public TotalButton(JTable jTable) {
// get table model
TableModel model = jTable.getModel();
// declare for variables
int x;
int y;
// initialize table placeholder
int totalValue = 0;
int rowCount = model.getRowCount();
int columnCount = model.getColumnCount();
// for loop for the first row
for (x = 0; x < rowCount; x++) {
for (y = 1; y < columnCount; y++) {
if (y == 10) {
break; // break when the loop reaches the total column
}
if (x == 0) {
String value = (String) model.getValueAt(x, y);
if ("".equals(value)) {
value = "0"; // avoiding empty string to integer error
}
int tempVal = Integer.parseInt(value); // turn the string into a number
totalValue = totalValue + tempVal; // adds the numbers to the total
}
}
String finalValue = Integer.toString(totalValue); // turn the number to a string
model.setValueAt(finalValue, 0, 10); // set total column value
}
基本上我添加了一个按钮来计算和填充表格的总行/列(在某些时候添加了一个keyListener但是,正如我所说,它感觉有点笨拙......不是说使用按钮感觉有什么不同但很好..)。
您可以在总行/列中的每个单元格中添加您可以在片段中读取的循环(仅发布一部分,因为它与每个单元格几乎相同)。
还必须在jTable模型中使用“”-s更改null-s,以便我可以将列类型设置为String(后来用于Integer.parseInt()和Integer.toString())。 / p>
另一方面,当keyListener觉得有点笨拙时,它会在“真实”时间内更新表格(说“真实”,因为在表中插入新值不会算作keyPressed()直到下一个因某种原因击键。)
再次,感谢指针,程序似乎工作得相当好,即使它真的可以使用一些代码/逻辑抛光(我现在正在处理)。
PS:我知道这远不是最好的解决方案,但是我很高兴,因为我经过一段时间的研究后自己做了(当然,正如已经说过的那样,没有指针我不可能写那段代码)PPS:再次,谢谢你:P
答案 0 :(得分:3)
对于数字,请将TableModel
存储表达式设为String
,并让getValueAt()
的实现返回评估表达式的结果。有几个libraries可用。
答案 1 :(得分:0)
实际上,对于将String转换为int的那个部分,使用try / catch块可能会更好,如果它不能是int,则使其为0。这样它可以处理如果你把Bob,3.1415926等放在那里。