gpt4 book ai didi

java - 从java中的jtable单元获取最新值

转载 作者:行者123 更新时间:2023-12-04 05:08:54 25 4
gpt4 key购买 nike

有人可以举一个以下问题的例子:
我有一个像下面这样的 jtable

plus  |  minus  |   total
10 | 0 | 10
0 | 2 | 8
0 | 3 | 5

如何获得最新的总计(5)的值,以便我可以在公式中再次使用它
总计=总计+加减?此外,由于加号和减号将不断添加,总计的值将保持更新。

最佳答案

Can someone give an example of question below:


import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.Random;
import java.util.concurrent.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.DefaultTableModel;

public class ChangeNotifiersOnEvent extends JFrame implements Runnable {

private static final long serialVersionUID = 1L;
private boolean runProcess = true;
private Random random = new Random();
private javax.swing.Timer timerRun;
private Executor executor = Executors.newCachedThreadPool();
private String[] columnNames = {"Source", "Hit", "Last", "Ur_Diff"};
private JTable table;
private Object[][] data = {{"Swing Timer", 2.99, 5, 1.01},
{"Swing Worker", 7.10, 5, 1.010}, {"TableModelListener", 25.05, 5, 1.01}};
private DefaultTableModel model = new DefaultTableModel(data, columnNames);

public ChangeNotifiersOnEvent() {
table = new JTable(model) {

private static final long serialVersionUID = 1L;

@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
model.addTableModelListener(new TableModelListener() {

@Override
public void tableChanged(TableModelEvent tme) {
if (tme.getType() == TableModelEvent.UPDATE) {
if (tme.getColumn() == 1 && tme.getLastRow() == 2) {
double dbl = ((Double) table.getModel().getValueAt(2, 1))
- ((Integer) table.getModel().getValueAt(2, 2));
table.getModel().setValueAt(dbl, 2, 3);
} else if (tme.getColumn() == 1 && tme.getLastRow() == 0) {
prepareUpdateTableCell();
} else if (tme.getColumn() == 1 && tme.getLastRow() == 1) {
executor.execute(new MyTask(MyTask.UPDATE_TABLE_COLUMN));
}
}
}
});
table.setRowHeight(30);
table.setFont(new Font("Serif", Font.BOLD, 20));
table.getColumnModel().getColumn(0).setPreferredWidth(180);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
new Thread(this).start();
}

private void prepareUpdateTableCell() {
timerRun = new javax.swing.Timer(10, UpdateTableCell());
timerRun.setRepeats(false);
timerRun.start();
}

private Action UpdateTableCell() {
return new AbstractAction("Update Table Cell") {

private static final long serialVersionUID = 1L;

@Override
public void actionPerformed(ActionEvent e) {
double dbl = ((Double) table.getModel().getValueAt(0, 1))
- ((Integer) table.getModel().getValueAt(0, 2));
table.getModel().setValueAt(dbl, 0, 3);
}
};
}

@Override
public void run() {
while (runProcess) {
try {
Thread.sleep(250);
} catch (Exception e) {
e.printStackTrace();
}
changeTableValues();
}
}

private void changeTableValues() {
Runnable doRun = new Runnable() {

@Override
public void run() {
table.getModel().setValueAt(random.nextInt(128) + random.nextDouble(), 0, 1);
table.getModel().setValueAt(random.nextInt(256) + random.nextDouble(), 1, 1);
table.getModel().setValueAt(random.nextInt(512) + random.nextDouble(), 2, 1);

table.getModel().setValueAt(random.nextInt(128), 0, 2);
table.getModel().setValueAt(random.nextInt(128), 1, 2);
table.getModel().setValueAt(random.nextInt(128), 2, 2);
}
};
SwingUtilities.invokeLater(doRun);
}

private class MyTask extends SwingWorker<Void, Integer> {

private static final String UPDATE_TABLE_COLUMN = "update";
private String namePr;
private double dbl;

MyTask(String str) {
this.namePr = str;
}

@Override
protected Void doInBackground() throws Exception {
dbl = ((Double) table.getModel().getValueAt(1, 1))
- ((Integer) table.getModel().getValueAt(1, 2));
return null;
}

@Override
protected void done() {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
table.getModel().setValueAt(dbl, 1, 3);
}
});
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
ChangeNotifiersOnEvent frame = new ChangeNotifiersOnEvent();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setLocation(150, 150);
frame.pack();
frame.setVisible(true);
}
});
}
}

.

通知
  • 需要为 getColumnClass to Integer, Long or Double 设置适当的值
  • 正确的方法只是 AbstractTableModel 的用法(最简单的方法是在 DefaultTableModel 中覆盖此事件),然后覆盖 getValueAt() ,
  • getValueAt()仅计算所需列的正确公式
  • 我会被禁用 JTable.getTableHeader().setReorderingAllowed(false); ,否则必须setModelIndex或在计算之前
  • 关于java - 从java中的jtable单元获取最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15137355/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com