JTable -> TableModeListener - PullRequest
       29

JTable -> TableModeListener

1 голос
/ 09 апреля 2011

У меня есть JTable с DefaultTableModel в качестве модели.На столе у ​​меня есть несколько составляющих свинга, JComboBox и JCheckBox, установленных для определенного столбца с помощью DefaultCellEditor и DefaultCellRenderer.TableModelListener был добавлен в таблицу для регистрации изменений в редактируемых столбцах.В остальных столбцах будут отображаться сведения о выбранном компоненте, т. Е. Код товара -> цена товара, количество товара, классификация товара и т. Д.предметы другого JComboBox(itemClassification) меняются.Но вместе со сменой другого JComboBox мне нужно отобразить цену товара на той же таблице.Это изменение исправляет метод valueChanged, который делает бесконечный цикл valueChanged.

Как мне избавиться от вещи с бесконечным циклом?

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

Один из способов - проверить событие обновления, чтобы увидеть, для какого столбца это событие, и игнорировать столбцы, которые автоматически обновляются:

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);
    }
}
1 голос
/ 09 апреля 2011

На самом деле ... У меня также есть мой ответ.Я просто попадаю в API TableModelListener и обнаружил TableModelEvent.getColumn ()

Спасибо, ребята ...

1 голос
/ 09 апреля 2011

Вы можете удалить слушателя при внесении изменений изнутри самого слушателя, а затем повторно добавить его, когда закончите с изменениями.Или вы можете присвоить слушателю логическое свойство, которое активирует и деактивирует код слушателя, и установить его соответствующим образом из слушателя.

...