get latest value from jtable cell in java

后端 未结 3 2011
-上瘾入骨i
-上瘾入骨i 2021-01-22 06:54

Can someone give an example of question below: I have a jtable like below

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


        
相关标签:
3条回答
  • 2021-01-22 07:26

    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);
                }
            });
        }
    }
    

    .

    notice

    • required to set proper value for getColumnClass to Integer, Long or Double

    • proper of ways is only usage of AbstractTableModel (easiest as override this event in DefaultTableModel), there to override getValueAt(),

    • inside getValueAt() only calculate proper formula for desired column

    • I'd be disable JTable.getTableHeader().setReorderingAllowed(false);, otherwise have to setModelIndex or before calculations

    0 讨论(0)
  • 2021-01-22 07:31

    Call getValueAt(int row, int column). May return null for empty cells. Do not call this on the model as the table row number may not match the model row number if sorting is enabled and applied. Also the table column number may not match the model column number if table columns have been rearranged.

    0 讨论(0)
  • 2021-01-22 07:41

    Get the value from the table model. getModel().getValueAt(..)

    0 讨论(0)
提交回复
热议问题