Добавление TableModelListener в AbstractTableModel - PullRequest
0 голосов
/ 05 июля 2011

Я столкнулся с проблемой при добавлении TableModelListener к AbstractTableModel.Программа перестает работать, и JFrame не отвечает ни на какие нажатия кнопок или даже на закрытие JFrame.

Я хочу сделать включенным JButton, если количество строк в myTable равно или большечем 2 строки.

Вот мой код ...

Моя таблица:

public class MyTable extends JPanel
{
    public Main main;
    public ArrayList<MyData> lstData;
    public JTable table;
    public MyTableModel model;
    // ...

    public MyTable(ArrayList<MyData> lstData, Main main)
    {
        this.lstData = lstData;
        this.main = main;
        model = new MyTableModel(lstData);
        table = new JTable(model);
        // ...
    }

    // ...

    public int getTableSize()
    {
        return model.getRowCount();
    }
    public TableModel getModel()
    {
        return model;
    }

    public class MyTableModel extends AbstractTableModel
    {  
        protected String[] columnNames = new String[ ] {"#","Name", "Phone Number"};
        protected ArrayList<MyData> lstData;
        protected Class[] types = new Class[]{String.class, String.class, String.class};

        public MyTableModel(ArrayList<MyData> lstData)
        {    this.lstData = lstData;    }

        public void SetData(ArrayList<MyData> lstData)
        {    this.lstData = lstData; fireTableDataChanged();    }

        @Override
        public String getColumnName(int columnIndex)
        {    return columnNames[columnIndex];   }

        @Override
        public Class getColumnClass(int columnIndex)
        {    return types[columnIndex];   }

        public Object getValueAt(int row, int column)
        {
            if (row < 0 || row > lstData.size()) return null;
            MyData obj = lstData.get(row);
            switch(column)
            {
                case 0: return obj.getID();
                case 1: return obj.getName();
                case 2: return obj.getPhoneNumber();
                default: return null;
            }
        }

        public int getRowCount() {  return lstData.size();   }
        public int getColumnCount() {  return columnNames.length;   }

    }
}

Основной класс:

public class Main extends JFrame implements TableModelListener
{
    public static ArrayList<myData> lstData;
    public static MyTable table;
    public static JButton myButton;
    public Main()
    {
        // ...
        table = new MyTable(lstData, this);
        table.getModel().addTableModelListener(this);
        myButton = new JButton();
        myButton.setEnabled(false);
        // ...
    }

    // ...

    public void tableChanged(TableModelEvent e)
    {
       int firstRow = e.getFirstRow();
       int lastRow = e.getLastRow();
       int mColIndex = e.getColumn();

       switch(e.getType())
       {
           case TableModelEvent.INSERT:
           if(table.getTableSize() >= 2) myButton.setEnabled(true);
           else myButton.setEnabled(false);
           break;

           case TableModelEvent.DELETE:
           if(table.getTableSize() >= 2) myButton.setEnabled(true);
           else myButton.setEnabled(false);
           break;
       }
    }
}

Не могли бы вы помочь мне решить эту проблему?Заранее спасибо.

РЕДАКТИРОВАТЬ:

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

EDIT2:

Никаких ошибок или исключений не выдается после того, как я добавляю элементы в таблицу, это просто замораживает графический интерфейс без ответа

Ответы [ 3 ]

1 голос
/ 05 июля 2011

базовый учебник о TableModelListener здесь или здесь или здесь

лучше всего будет camickr Слушатель табличных ячеек , который реализует самые глубокие функции для прослушивания в TableCell

1 голос
/ 05 июля 2011

В вашем классе MyTableModel удалите следующую строку:

protected TableModel model = this;

А также удалите следующие методы:

public void setModel(TableModel model){
    this.model = model;
}

public TableModel getModel() {
    return model;
}

Вы уже реализуете пользовательскую модель таблицы, нетнужно создать эту собственную ссылку внутри него.Когда ваш класс создается, переменная , эта не инициализируется полностью, и я подозреваю, что именно это вызывает у вас проблемы.Но в любом случае код определенно не нужен.Кроме того, в вашем классе MyTable я бы порекомендовал изменить функцию getModel (), чтобы отложить ее до вашей переменной таблицы.Вот так:

public TableModel getModel() {
    return model.getModel();
}
0 голосов
/ 05 июля 2011

Спасибо, ребята, за вашу помощь, я решил эту проблему, изменив метод tableChanged:

public void tableChanged(TableModelEvent e)
{
   if(table.getTableSize() >= 2) myButton.setEnabled(true);
       else myButton.setEnabled(false);
}
...