将对象转换为JTable?

时间:2010-05-18 19:32:31

标签: java swing

我正在尝试为我的一些JTable实现ListSelectionListener。简单地(此时)ListSelectionListener应该只返回所选单元格的文本。

我的程序设计有几个JTable,我想让一个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())与我的所有JTable进行比较以查看它们是否等效(如果是块大)然后只是在该块内部调用.getValueAt但这会产生代码如果要添加或删除表格,将来会很困难。

4 个答案:

答案 0 :(得分:1)

在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进行调试是邪恶的。你的调试器是你的朋友。

答案 1 :(得分:1)

如错误所示,相关的源对象是DefaultListSelectionModel而不是JTable。这是有道理的,因为事件的源(即触发事件的对象)是选择模型对象,而不是表。此外,模型本身不会假设哪种类型的对象将它们用作模型,因此无法通过选择模型获得对表的引用。

答案 2 :(得分:0)

将JTable实例传递给选择处理程序。只要处理程序侦听一个表,您就可以使用该实例而不是依赖事件中的信息。

答案 3 :(得分:0)

我认为有两个主要的解决方案:

  • 使用JList并注册侦听器而不是模型,而是直接注册列表。然后,如果列表包含在表中,您可以要求列表的(组件)父级查找负责的表
  • 覆盖DefaultListSelectionModel(例如)在构造函数中获取一个额外的参数,该参数将是一个JTable实例(每个表都需要该模型的新实例)。您可以将该实例保存在实例变量中,然后可以在事件发生时直接在表上操作

我不认为这些解决方案中的任何一个都是理想的。我觉得你可以通过使用一些模式或习语让你知道源是哪个表来让你的生活变得更轻松。但是为了给你提供任何线索,我们必须看到你的代码更多。