JTable -> TableModeListener

前端 未结 3 630
情歌与酒
情歌与酒 2020-11-28 16:53

I have this JTable having a DefaultTableModel as its model. On the table I have several swing component, JComboBox and JCheckBox

相关标签:
3条回答
  • 2020-11-28 17:22

    You could remove the listener when making changes from within the listener itself, and then re-add it when done with changes. Or you could give the Listener a boolean property that activates and deactivates the listener code, and set it appropriately from within the listener.

    0 讨论(0)
  • 2020-11-28 17:32

    Actually... I have also my answer. I just get into the API of TableModelListener and I found the TableModelEvent.getColumn()

    Thanks guys...

    0 讨论(0)
  • 2020-11-28 17:34

    One way is to check the update event to see what column the event is for and ignore columns that are automatically updated:

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    
    public class TableProcessing extends JFrame implements TableModelListener
    {
        public TableProcessing()
        {
            super("Table");
            String[] columnNames = {"Item", "Quantity", "Price", "Cost"};
            Object[][] data =
            {
                {"Bread", new Integer(1), new Double(1.11), new Double(1.11)},
                {"Milk", new Integer(1), new Double(2.22), new Double(2.22)},
                {"Tea", new Integer(1), new Double(3.33), new Double(3.33)},
                {"Cofee", new Integer(1), new Double(4.44), new Double(4.44)}
            };
    
            DefaultTableModel model = new DefaultTableModel(data, columnNames);
            model.addTableModelListener( this );
    
            JTable table = new JTable( model )
            {
                //  Returning the Class of each column will allow different
                //  renderers to be used based on Class
                public Class getColumnClass(int column)
                {
                    return getValueAt(0, column).getClass();
                }
    
                //  The Cost is not editable
                public boolean isCellEditable(int row, int column)
                {
                    int modelColumn = convertColumnIndexToModel( column );
                    return (modelColumn == 3) ? false : true;
                }
            };
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
    
            JScrollPane scrollPane = new JScrollPane( table );
            getContentPane().add( scrollPane );
    
    
            String[] items = { "Bread", "Milk", "Tea", "Coffee" };
            JComboBox editor = new JComboBox( items );
    
            DefaultCellEditor dce = new DefaultCellEditor( editor );
            table.getColumnModel().getColumn(0).setCellEditor(dce);
        }
    
        /*
         *  The cost is recalculated whenever the quantity or price is changed
         */
        public void tableChanged(TableModelEvent e)
        {
            if (e.getType() == TableModelEvent.UPDATE)
            {
                int row = e.getFirstRow();
                int column = e.getColumn();
    
                if (column == 1 || column == 2)
                {
                    TableModel model = (TableModel)e.getSource();
                    int quantity = ((Integer)model.getValueAt(row, 1)).intValue();
                    double price = ((Double)model.getValueAt(row, 2)).doubleValue();
                    Double value = new Double(quantity * price);
                    model.setValueAt(value, row, 3);
                }
            }
        }
    
        public static void main(String[] args)
        {
            TableProcessing frame = new TableProcessing();
            frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible(true);
        }
    }
    
    0 讨论(0)
提交回复
热议问题