[英]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.