如何判断哪个项目触发了鼠标侦听器

时间:2011-03-20 00:55:30

标签: java swing mouseevent jlabel mouselistener

全部,

我正在尝试编写一个简单的星级评分组件。我是Java语言的新手,我不确定我想要完成的任务是否可以用Java完成。我是否可以在JLabel数组中添加JLabel,并且数组中的每个JLabel都有一个鼠标事件监听器。现在是否可以设置它以便当鼠标事件触发时说Label [3]我可以得到它的索引值?

以下是我构建Panel的方法

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的方法。

感谢。

5 个答案:

答案 0 :(得分: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而不是JLabel,因为他们可以更好地支持动作事件。你仍然可以给他们图标。

答案 1 :(得分:2)

您可以使用其setName方法根据索引命名每个JLabel,然后使用MouseEvent的getComponent方法返回原始JLabel,在其上使用getName,这就是您的索引。这将是一种方式,将涉及将索引信息存储在两个位置(隐式地将其存储在数组中,并显式地作为标签的名称),因此它几乎要求出现不一致性。

您还可以在数组中搜索从getComponent获得的JLabel引用,但这也不是很好,特别是对于大型数组。

答案 2 :(得分:1)

我通常这样做的方式是:

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

现在position[i]是您要找的标签。

答案 3 :(得分:0)

只要知道JButton可以任何你喜欢的方式。他们可以拥有ImageIcons,甚至不必看起来像按钮。

答案 4 :(得分:0)

为什么指数很重要?您知道如何获取组件,因此只需遍历数组即可获得索引。

  

注意我想过使用按钮,但它看起来很乱,很想找到ImageIcons的方法。

如何使用按钮解决确定索引的问题?但是,我也同意使用一个按钮比一个标签更好然后你会使用ActionListener而不是MouseListener。您可以使用以下命令使按钮看起来像标签:

button.setBorderPainted( false );

现在,如果使用ActionListener,则可以使用setActionCommand(...)方法存储按钮的索引值。然后,如果您使用getActionCommand(...)方法。