【发布时间】:2015-01-05 18:13:06
【问题描述】:
我有一个 JTable 女巫实现了 TableModelListener,我已经实现了 tableChanged(TableModelEvent event) 方法,但我无法检测到被修改的正确列。我得到 col -1,而我正在编辑第二列或特定列。
这是我对 tableChanged(TableModelEvent event) 方法的实现:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
public class JTableTest extends JDialog{
private JTable myTable ;
public JTableTest() {
super();
myTable = new JTable(new myTableModel());
getContentPane().add(new JScrollPane(myTable),BorderLayout.CENTER);
pack();
}
class myTableModel extends AbstractTableModel implements TableModelListener{
Object[][] donnees = {
{"Johnathan", "Sykes","Natation"},
{"Nicolas", "Van de Kampf","FOOTBALL" },
{"Damien", "Cuthbert","TENNIS" },
{"Corinne", "Valance","NATATION"},
{"Emilie", "Schrödinger","FOOTBALL"},
{"Delphine", "Duke","TENNIS"},
{"Eric", "Trump","TENNIS"},
};
String[] entetes = {"Prénom", "Nom","SPORT"};
public myTableModel() {
addTableModelListener(this);
}
public int getRowCount() {
return donnees.length;
}
public int getColumnCount() {
return entetes.length;
}
public String getColumnName(int columnIndex) {
return entetes[columnIndex];
}
public Object getValueAt(int rowIndex, int columnIndex) {
return donnees[rowIndex][columnIndex];
}
@Override
public void tableChanged(TableModelEvent me) {
// I wanna get the right column not -1
System.out.println(me.getColumn());
switch(me.getType()){
case TableModelEvent.UPDATE:
System.out.println("Updating...");break;
case TableModelEvent.INSERT:
System.out.println("Inserting...");break;
case TableModelEvent.DELETE:
System.out.println("Delete...");break;
default :break ;
}
}
@Override
public void setValueAt(Object value, int row, int col) {
donnees[row][col] = (String) value;
fireTableDataChanged();
}
@Override
public boolean isCellEditable(int row, int col) {
return true;
}
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new JTableTest().setVisible(true);
}
});
}
}
【问题讨论】:
-
它返回常量 TableModelEvent.ALL_COLUMNS。您是否检查了 event.getType() 以确保您获得更新?如果不是,则将您的代码包装在 if 或 switch 中。
-
我添加了 event.getType(),我得到了更新,但 event.getColumn() 仍然返回 -1,而我正在更改活动列(1 或 2)
-
你能添加你的表创建代码吗?我通常使用 AbstractTableModel 的子类创建 JTable,它允许您覆盖 setValue。我发现这比响应事件更容易。
-
不会解决你的问题,但不要手动调用“firstTableDataChanged()”。 TableModel 负责在数据更改时调用该方法。我从来没有遇到过 TableModelListener 的问题。发布您的SSCCE 来证明问题。请记住,当第 3 列中的数据更新时,SSCCE 应该只显示一条消息。我们不关心您的实际处理。
-
我写了一个sscce例子
标签: java swing event-handling jtable