有人可以給下面的問題的一個例子: 我有一個像下面獲得從Java JTable中單元格最新值
plus | minus | total
10 | 0 | 10
0 | 2 | 8
0 | 3 | 5
我怎樣才能獲得最新值累計一個JTable(5),所以我可以使用它又在公式 total = total + plus-minus?此外,總值將保持更新,因爲加號和減號將被連續添加。
有人可以給下面的問題的一個例子: 我有一個像下面獲得從Java JTable中單元格最新值
plus | minus | total
10 | 0 | 10
0 | 2 | 8
0 | 3 | 5
我怎樣才能獲得最新值累計一個JTable(5),所以我可以使用它又在公式 total = total + plus-minus?此外,總值將保持更新,因爲加號和減號將被連續添加。
有人可以給下面的問題的一個例子:
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);
}
});
}
}
。
通知
正確的方式是AbstractTableModel只使用(最簡單的方式覆蓋在DefaultTableModel
這個事件),還有覆蓋getValueAt()
設置適當的值需要,
裏面getValueAt()
只計算所需列的正確公式
我會禁用JTable.getTableHeader().setReorderingAllowed(false);
,否則必須setModelIndex或計算
-1 a)從監聽器操作模型(這是模型職責)b)在視圖中重寫getColumnClass(再次,模型業務)c)invokeLater完成(它已經在EDT上,任何排序問題都是home-brewn由於在聽衆中的模型修改不正確)d)輕微:由於開發者的懶惰而限制了可用性
e)在EDT上睡覺f)在doInBackground中訪問模型......舊代碼或爲什麼所有這些故障?我知道你知道他們是錯的:-) – kleopatra 2013-02-28 15:56:43
呵呵,你確定關於點e)這是不是所有'Runnable#Thread'和'public void run(){',這是在'SwingWorker'之前作爲一個'standard',在SwingWorker死後仍然會在那裏,比在SwingWorker中實現的black_hole更好。 – mKorbel 2013-02-28 18:15:25
致電getValueAt(int row, int column)。可能爲空單元格返回null。不要在模型上調用此函數,因爲如果啓用並應用排序,表格行號可能與模型行號不匹配。如果表格列已重新排列,則表格列號可能與模型列號不匹配。
對不起表看起來很有趣了。請使用下面的代碼:plus 10 0 0 minus 0 2 3 total10 8 5 – sytherion 2013-02-28 13:59:52
我爲你解決了這個問題 – Doorknob 2013-02-28 14:00:08
人們真的覺得在發佈一分鐘後必須''''嗎?也許他們正在格式化? – 2013-02-28 14:01:52