簡體   English   中英

使用MouseListener在JLabel中設置和獲取對象

[英]Setting and getting an object in a JLabel with a MouseListener

我有一個帶有MouseListenerJLabel

label.addMouseListener( new ClickController() );

要執行的操作所在的位置

class ClickController{
...
public void mouseClicked(MouseEvent me) {
        // retrieve Label object
}

有沒有辦法將對象與JLabel關聯,以便我可以從mouseClicked方法中訪問它?

編輯:

為了給出一個更具說明性的例子,我在這里要做的是將JLabels設置為撲克牌的圖形表示。 標簽旨在表示具有所有實際數據的對象卡。 所以我想將該Card對象與JLabel相關聯。

解:

正如'Hovercraft Full Of Eels' me.getSource()me.getSource()是要走的路。 在我的特定情況下將是:

Card card = new Card();
label.putClientProperty("anythingiwant", card);
label.addMouseListener( new ClickController() );

並從偵聽器獲取Card對象:

public void mouseClicked(MouseEvent me) {
   JLabel label = (JLabel) me.getSource();
   Card card = (Card) label.getClientProperty("anythingiwant");
   // do anything with card
}

您可以通過在所有MouseListener和MouseAdapter方法中返回的MouseEvent上調用getSource()來輕松獲取單擊的對象。 如果將MouseListener添加到多個組件中,則單擊一個將以這種方式返回。

public void mousePressed(MouseEvent mEvt) {
   // if you're sure it is a JLabel!
   JLabel labelClicked = (JLabel) mEvt.getSource();
}

注意:我通常更喜歡在mouseClicked()使用mousePressed()方法,因為它不那么“怯懦”並且即使鼠標在按下之后和釋放之前移動也會記錄按下。

您可以簡單地使用Map<JLabel, Card> (如果您想從標簽上獲取卡片),或者使用Map<Card, JLabel> (如果您想從卡片中獲取標簽)。

當然,一種簡單的方法是在ClickController中創建一個ClickController JLabel的構造函數。 然后,您可以訪問對象中的特定JLabel 例如:

class ClickController{
    private JLabel label;
    public ClickController(JLabel label){
        this.label = label;
    }    ...
    public void mouseClicked(MouseEvent me) {
        label.getText()//Or whatever you want
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM