繁体   English   中英

将 TableModelListener 添加到 AbstractTableModel

[英]Adding TableModelListener to AbstractTableModel

我在将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;   }

    }
}

主class:

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 才会停止响应。

编辑2:

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

在您的 MyTableModel class 中,删除以下行:

protected TableModel model = this;

并删除以下方法:

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

public TableModel getModel() {
    return model;
}

您已经在实现自定义表 model,无需在其中创建自引用。 当你的 class 被实例化时,这个变量没有完全初始化,我怀疑这就是给你带来问题的原因。 但无论如何,绝对不需要代码。 此外,在您的 MyTable class 中,我建议更改 getModel() function 以遵循您的包装表变量。 像这样:

public TableModel getModel() {
    return model.getModel();
}

关于TableModelListener的基本教程这里这里这里

最好是 camickr Table Cell Listener ,它实现了 TableCell 中侦听的最深功能

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM