2010-05-18 185 views
0

我想为我的一些JTables实现一个ListSelectionListener。简单地说(现在)ListSelectionListener应该简单地返回被选择的单元格的文本。将对象投射到JTable?

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

+0

你应该可以做这样的事情。你有两条线投。哪一行抛出'ClassCastException'?什么是对象的实际类型(异常消息应该说一些其他类名)? – erickson 2010-05-18 19:37:32

+0

我想“e”应该是一个事件。那么,你是否能够弄清楚,实际的来源是什么?是否有东西叠在桌子上,这会成为事件的根源?这可能有助于发布更多的代码。 – 2010-05-18 19:37:42

+0

您没有提供必要的信息。请在你的问题中包含完整的错误信息。 – erickson 2010-05-18 19:44:45

回答

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

+0

我继续使用这个方法:Object source = e.getSource(); System.out.println(source.getClass());并发现来源不符合我的预期。它的类javax.swing.DefaultListSelectionModel。这意味着我显然不知道如何使用JTable工作。有没有办法找出DefaultListSelectionModel与哪个JTable关联? – Chris 2010-05-18 19:51:41

+0

我不是一个挥杆亲,我只知道我的Java。自2003年以来还没有做过挥杆:-) 其他人? – 2010-05-18 19:59:16

+0

我不同意打印报表是恶意的,但对于调试提示+1。 – 2010-05-18 20:04:22

1

正如错误所暗示的,所讨论的源对象是DefaultListSelectionModel而不是JTable。这很有意义,因为事件的来源(即触发事件的对象)是选择模型对象,而不是表格。而且,模型本身并不假定什么类型的对象将它们用作模型,因此无法通过选择模型获取对表的引用。

0

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

0

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

  • 使用JList和注册监听器不是模式,而是直接与名单。然后,如果列表包含在一个表中,那么您可以要求列表的(Component)父级找到相关的表
  • 重写DefaultListSelectionModel(例如)在构造函数中添加一个参数,该参数将是一个JTable实例(每个表格都需要该模型的新实例)。您将该实例保存在一个实例变量中,然后可以在发生事件时直接在桌面上运行

我不认为这两种解决方案都是理想的。我有这样的感觉,你可以通过使用某种模式或习惯用法来让你的生活更轻松,以避免必须知道源是哪个表。但是为了给你提供任何线索,我们必须看到更多的代码。