我在向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而没有响应
答案 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 here或here或here
最好的是camickr Table Cell Listener,它可以在TableCell中实现最深的听力功能
答案 2 :(得分:0)
谢谢你们的帮助,我通过修改tableChanged
方法解决了这个问题:
public void tableChanged(TableModelEvent e)
{
if(table.getTableSize() >= 2) myButton.setEnabled(true);
else myButton.setEnabled(false);
}