将TableModelListener添加到AbstractTableModel

时间:2011-07-05 13:20:02

标签: java swing jtable listener

我在向TableModelListener添加AbstractTableModel时遇到了问题。程序停止工作,JFrame不响应任何按钮点击甚至关闭JFrame。

如果myTable中的行数等于或大于2行,我想要启用JButton

这是我的代码......

我的自定义表格

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:

我向表中添加元素后没有抛出任何错误或异常,它只是冻结gui而没有响应

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

基本tutorial关于TableModelListener hereherehere

最好的是camickr Table Cell Listener,它可以在TableCell中实现最深的听力功能

答案 2 :(得分:0)

谢谢你们的帮助,我通过修改tableChanged方法解决了这个问题:

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