2010-05-18 148 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實例(每個表格都需要該模型的新實例)。您將該實例保存在一個實例變量中,然後可以在發生事件時直接在桌面上運行

我不認爲這兩種解決方案都是理想的。我有這樣的感覺,你可以通過使用某種模式或習慣用法來讓你的生活更輕鬆,以避免必須知道源是哪個表。但是爲了給你提供任何線索,我們必須看到更多的代碼。