我正在尝试为某些JTables实现ListSelectionListener。简单地说(目前),ListSelectionListener应该简单地返回所选单元格的文本。
我的程序设计中有几个JTables,我想为它们全部使用一个ListSelectionListener。在ListSelectionListener的valueChanged事件中,我认为可以执行以下操作:
private class SelectionHandler implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e)
{
JTable table = (JTable)e.getSource();
String data = (String) table.getValueAt(table.getSelectedRow(), 0);
// Print data
}
}
在幕后,我使用了以下代码来使SelectionHandler处理所涉及的表:
fbTable.setCellSelectionEnabled(true);
ListSelectionModel cellSM = fbTable.getSelectionModel();
cellSM.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
cellSelectionModel.addListSelectionListener(selectionHandler);
当我运行程序时,出现ClassCastException错误:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.DefaultListSelectionModel cannot be cast to javax.swing.JTable
at cardboardfantasy.CardboardFantasyView$SelectionHandler.valueChanged(CardboardFantasyView.java:360)
// This is the line in question: JTable table = (JTable)e.getSource();
有没有办法做这样的事情?我想到的一种解决方案是将事件的源(e.getSource())与我的所有JTables进行比较,以查看它们是否等效(如果为block,则为大),然后在该块中调用.getValueAt,但这将使代码如果将来要添加或删除表,将来会很困难。
最佳答案
可以在IDE中调试代码,设置断点,然后查看e.getTarget()的类型是什么:
Object source = e.getSource();
JTable table = (JTable)source; // breakpoint on this line and inspect the variable 'source'
String data = (String) table.getValueAt(table.getSelectedRow(), 0);
或者,如果由于某种原因无法进行调试,请执行以下操作:
Object source = e.getSource();
System.out.println(source.getClass());
但是:使用System.out.println进行调试是邪恶的。您的调试器是您的朋友。
关于java - 将对象转换为JTable?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2860449/