我有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
}
答案 0 :(得分:6)
通过在所有MouseListener和MouseAdapter方法中返回的MouseEvent上调用getSource()
,可以轻松获取单击的对象。如果将MouseListener添加到多个组件中,则单击一个将以这种方式返回。
即,
public void mousePressed(MouseEvent mEvt) {
// if you're sure it is a JLabel!
JLabel labelClicked = (JLabel) mEvt.getSource();
}
注意:我通常更喜欢使用mousePressed()
方法而不是mouseClicked()
因为它不那么“怯懦”并且即使鼠标在按下之后和释放之前移动也会记录按下。
答案 1 :(得分:2)
您可以简单地使用Map<JLabel, Card>
(如果您想从标签上获取卡片)或Map<Card, JLabel>
(如果您想从卡片中获取标签)。
答案 2 :(得分: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
}
}