4

我有JLabel一个MouseListener

label.addMouseListener( new ClickController() );

要执行的操作在哪里

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

有什么方法可以将对象与 JLabel 关联,以便我可以从 mouseClicked 方法中访问它?

编辑:

举一个更说明性的例子,我在这里尝试将 JLabels 设置为扑克牌的图形表示。标签旨在表示具有所有实际数据的对象卡。所以我想将该 Card 对象与 JLabel 相关联。

解决方案:

正如“满载鳗鱼的气垫船”所暗示的那样,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
}
4

3 回答 3

6

您可以通过调用getSource()所有 MouseListener 和 MouseAdapter 方法中返回的 MouseEvent 轻松获取单击的对象。如果将 MouseListener 添加到多个组件中,则单击的一个将以这种方式返回。

IE,

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

注意:我通常更喜欢使用该mousePressed()方法,mouseClicked()因为它不那么“怯懦”并且即使鼠标在按下之后和释放之前移动也会注册按下。

于 2012-11-02T22:29:42.447 回答
2

您可以简单地使用 a Map<JLabel, Card>(如果您想从标签中获取卡片)或 a Map<Card, JLabel>(如果您想从卡片中获取标签)。

于 2012-11-02T22:34:38.313 回答
1

当然,一种简单的方法是创建一个构造函数,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
    }
}
于 2012-11-02T22:14:45.873 回答