全部,
我正在尝试编写一个简单的星级评分组件。我是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的方法。
感谢。
答案 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(...)方法。