2010-09-23 73 views
1

我正在開發一個帶有不同行的JTable。我想將一個事件關聯到此表中選定的行。我已經使用以下選擇類,以提供行爲表中選擇:在JTable中實現選擇監聽器時的問題

public class TableSelectionListener implements ListSelectionListener{ 

public Integer item;  

public TableSelectionListener(Integer item){ 
    this.dialog = item; 
} 

public void valueChanged(ListSelectionEvent e) { 

    System.out.println("The row clicked is "+item); 

    } 
} 

當我創建該表的一個實例,賽tabletest,我已經添加了下面的代碼段:

tabletest.getSelectionModel().addListSelectionListener(new TableSelectionListener(tabletest.getSelectedRow()); 

問題是,當我單擊一行一次,而不是一次檢索相關消息時,我多次檢索相同的消息,表明這些操作重複多次。例如:

The row clicked is 0 
The row clicked is 0 
The row clicked is 0 
The row clicked is 0 

有沒有人知道問題出在哪裏?

回答

4

嗯,這很正常。

您的選擇偵聽器在其創建表(其值爲零)下創建值tabletest.getSelectedRow()。而且,由於您從未在收聽者中更改item的值,因此此收聽者只能顯示0

如果我是你,我wouold通過類似更換valueChanged()方法(雖然它是未經檢驗的,我記得奇怪的事情有時會發生混合視圖和模型行值時)這樣的:

public void valueChanged(ListSelectionEvent e) { 
    if(!e.getValueIsAdjusting()) // added as sometimes, multiple events are fired while selection changes 
     System.out.println("The row clicked is "+e.getFirstIndex()); 
} 
+0

好了,這是行不通的:如果我點擊第二排和第三排的消息輸出是正確的:「點擊該行1」和「點擊的行是2」。但是,當我點擊第一行而不是給我0它再次給我2 – Anto 2010-09-23 16:18:39

+0

另一種方法是從表中向聽衆詢問選擇了哪些行。 – Carlos 2010-09-23 21:48:18

+4

'e.getFirstIndex()'不是很可靠。使用table.getSelectedRow() - 它更穩定。 – 2010-09-24 14:17:37

4

首先,這是完全正常獲得多個ListSelectionEvent s,而選擇正在改變。您可以使用getValueIsAdjusting方法確定選擇何時結束(它將返回false)。

其次,沒有必要用行號構造你的TableSelectionListener。當調用valueChanged方法時,可以分別使用e.getFirstIndex()e.getLastIndex()獲取第一個/最後一個選定行的索引(請記住可能會在表中選擇多行,除非您禁用該行)。

2

做的更簡單的方法,如下:

table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 
    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     System.out.println("e...."+table.getSelectedRow()); 
    } 
}); 
+0

你爲這種感覺簡單而付出的代價是從聽衆到表格 - 通常不是你想要的。此外,您忘記了isAdjusting的檢查:通常,您想忽略這樣的事件。 – kleopatra 2012-10-10 08:44:55