在swing的jtable中,怎么实现自动计算呢,就是类似于execl表格中,输入某个计算公式后,改变对应的值,会自动更新结果值。
其实对于jtable来说不难,直接用TableModelListener监听器就行了,代码如下:
import java.awt.*;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setBounds(100, 100, 800, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBounds(0, 0, 600, 361);
String[][] str = {{"小贾", "60", "70", "50", ""}, {"阿P", "80", "90", "60", ""}, {"小李", "70", "70", "70", ""}};
String[] title = {"姓名", "语文分数", "数学分数", "英语分数", "总分数"};
JTable table = new JTable();//测试表格
table.putClientProperty("terminateEditOnFocusLost", true);
DefaultTableModel dtm = new DefaultTableModel(str, title);
table.setModel(dtm);
table.setFont(new Font("微软雅黑", Font.PLAIN, 12));
dtm.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
int type = e.getType();// 获得事件的类型
int row = e.getFirstRow();// 获得触发此次事件的表格行索引
System.out.println("row:" + row);
int column = e.getColumn();// 获得触发此次事件的表格列索引
System.out.println("column:" + column);
//总分数在第5列,当column = 4时,直接return
if (column == 4) return; //这个判断必须加,哪一列需要自动修改,就在那一列return,不然会出现异常报错。
if (type == TableModelEvent.UPDATE) {
TableModel model = (TableModel) e.getSource();//自动获取表格模型
//我这里是直接刷新全部的列的值,你们也可以根据需要刷新对应行的列值也行
int rows = table.getRowCount();
for (int i = 0; i < rows; i++) {
int yuwen = Integer.parseInt(table.getValueAt(i,1).toString());
int shuxue = Integer.parseInt(table.getValueAt(i,2).toString());
int yingyu = Integer.parseInt(table.getValueAt(i,3).toString());
table.setValueAt((yuwen+shuxue+yingyu),i,4);
}
}
}
});
JScrollPane scrollPane_1 = new JScrollPane(table);//滚动组件
panel.add(scrollPane_1, BorderLayout.CENTER);
frame.add(panel);
frame.setVisible(true);
}
}
其中,需要特别注意的就是在tableChanged(TableModelEvent e)函数中,一定要加入 if (column == 4) return;这一行,因为我的总分数在第五列,对应索引就是4,代码中也有特别说明。这个判断必须加,哪一列需要自动修改,就在那一列return,不然会出现异常报错。
运行代码后效果如下图
修改每个分数值,对应的总分数都会变化。