2013-02-28 77 views
2

有人可以给下面的问题的一个例子: 我有一个像下面获得从Java JTable中单元格最新值

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

我怎样才能获得最新值累计一个JTable(5),所以我可以使用它又在公式 total = total + plus-minus?此外,总值将保持更新,因为加号和减号将被连续添加。

+0

对不起表看起来很有趣了。请使用下面的代码:plus 10 0 0 minus 0 2 3 total10 8 5 – sytherion 2013-02-28 13:59:52

+0

我为你解决了这个问题 – Doorknob 2013-02-28 14:00:08

+0

人们真的觉得在发布一分钟后必须''''吗?也许他们正在格式化? – 2013-02-28 14:01:52

回答

1

有人可以给下面的问题的一个例子:

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或计算

+0

-1 a)从监听器操作模型(这是模型职责)b)在视图中重写getColumnClass(再次,模型业务)c)invokeLater完成(它已经在EDT上,任何排序问题都是home-brewn由于在听众中的模型修改不正确)d)轻微:由于开发者的懒惰而限制了可用性 kleopatra 2013-02-28 15:53:19

+0

e)在EDT上睡觉f)在doInBackground中访问模型......旧代码或为什么所有这些故障?我知道你知道他们是错的:-) – kleopatra 2013-02-28 15:56:43

+0

呵呵,你确定关于点e)这是不是所有'Runnable#Thread'和'public void run(){',这是在'SwingWorker'之前作为一个'standard',在SwingWorker死后仍然会在那里,比在SwingWorker中实现的black_hole更好。 – mKorbel 2013-02-28 18:15:25

1

从表格模型中获取值。 getModel()。getValueAt(..)

+0

如果已应用排序或列重新排列,将返回错误的值。 – h22 2013-02-28 14:05:31

+0

@Audrius:然后table.getModel()。getValueAt(table.convertRowIndexToModel(rowIndex),table.convertColumnIndexToModel()) – 2013-03-01 22:11:44

+0

是的,这种方式将工作。 – h22 2013-03-02 12:51:01

1

致电getValueAt(int row, int column)。可能为空单元格返回null。不要在模型上调用此函数,因为如果启用并应用排序,表格行号可能与模型行号不匹配。如果表格列已重新排列,则表格列号可能与模型列号不匹配。