2013-02-28 84 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。不要在模型上調用此函數,因爲如果啓用並應用排序,表格行號可能與模型行號不匹配。如果表格列已重新排列,則表格列號可能與模型列號不匹配。