2011-03-20 111 views
2

HI all,如何判斷哪個項目觸發了鼠標收聽器

我正在嘗試編寫一個簡單的星級評估組件。我對Java語言相當陌生,我不確定我想要完成的任務甚至可以用Java來完成。是否可以在JLabel數組中添加JLabel,並且數組中的每個JLabel都有一個鼠標事件偵聽器。現在是否可以設置它,以便在鼠標事件發生時觸發標籤[3],我可以獲取它的索引值?

這裏是我建我的面板

public Rating(Integer max,int size) { 

JLabel position = new JLabel[max]; 


    this.setLayout(new FlowLayout()); 
    for(int i=0; i != max;i++){ 
    position[i]=new JLabel(icons.getIcon("star-empty", size)); 
    position[i].setOpaque(true); 
    position[i].addMouseListener(this); 
    add(position[i]); 
    } 
} 


@Override 
public void mouseEntered(MouseEvent e) { 
    JLabel a= (JLabel) e.getComponent(); 
    //****Have some code in here to tell me where in the position array the event came from????*** 
    int index = ????? 
    } 

思考/觀點/建議請。

注意我想使用按鈕,但它看起來很亂,並且很想用ImageIcons找到一種方法。

THanks。

回答

3

而是像你這樣使用同一個偵聽每個標籤:

position[i].addMouseListener(this); 

...你可以創建一個特殊的監聽器類,它的索引號,並允許您稍後找到它:

position[i].addMouseListener(new RatingMouseListener(i)); 

每個標籤將有聽者的一個單獨的實例與不同的索引值。內部類的代碼看起來像這樣:

private class RatingMouseListener extends MouseAdapter { 
    private final int index; 

    public RatingMouseListener(int index) { 
     this.index = index; 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     System.out.println("Mouse entered for rating " + index); 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     System.out.println("Mouse exited for rating " + index); 
    } 
} 

然後,您只需重寫MouseAdapter中的任何方法。

另外,和其他人一樣,您可能需要使用JButton s而不是JLabel s,因爲他們對動作事件有更好的支持。你仍然可以給他們圖標。

0

只要知道JButtons可以看你喜歡的任何方式。他們可以擁有ImageIcons,甚至不需要看起來像按鈕。

1

的方式,我通常做的是:

int i; 
for (i = 0; i <max; i++) 
    if (position[i] == e.getcomponent()) 
    break; 

現在position[i]是你正在尋找的標籤。

2

您可以使用它的setName方法根據其索引命名每個JLabel,然後使用MouseEvent的getComponent方法獲取原始JLabel,並使用getName和索引。這將是一種方式,將涉及將索引信息存儲在兩個地方(隱式地將其放置在數組中,並顯式地作爲標籤的名稱),所以它幾乎要求出現不一致。

您也可以通過數組搜索從getComponent獲得的JLabel引用,但這並不是那麼好,特別是對於大型數組。

0

爲什麼指數很重要?您知道如何獲取組件,因此只需遍歷數組即可獲取索引。

注意我想使用按鈕,但它看起來很亂,並且很想用ImageIcons找到一種方法。

如何使用按鈕解決確定索引的問題?不過,我也同意使用按鈕比標籤更好,然後使用ActionListener而不是MouseListener。您可以通過使用使按鈕看起來像一個標籤:

button.setBorderPainted(false); 

現在,如果你使用,你可以使用setActionCommand(...)方法來存儲按鈕的索引值一個ActionListener。然後在使用getActionCommand(...)方法的情況下。

+0

索引重要的原因是因爲任何小於等於被點擊的索引需要設置爲「true」,所以我可以繪製一個填充的開始,並可以返回其他用途的評分。 – user597608 2011-03-20 01:07:53

+0

因此,您可以遍歷按鈕陣列併爲每個按鈕設置圖標,直至包括點擊的按鈕。無論如何,你已經得到了如何做到這一點的答案。 – camickr 2011-03-20 02:08:56

相關問題