我正在尝试为某些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/

10-08 22:16