Java 将mouseClicked事件(MouseListener)与多个JLabel一起使用

Java 将mouseClicked事件(MouseListener)与多个JLabel一起使用,java,swing,jlabel,mouselistener,Java,Swing,Jlabel,Mouselistener,我有一个GUI,有大约26个不同的标签,但我希望在单击时能够为所有标签执行相同的代码,所以我想我会使用MouseListener和mouseClicked方法来执行代码。我遇到的问题是,当我单击任何标签时,会出现以下错误: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JRootPane cannot be cast to javax.swing.JLabel at dealorn

我有一个GUI,有大约26个不同的标签,但我希望在单击时能够为所有标签执行相同的代码,所以我想我会使用MouseListener和mouseClicked方法来执行代码。我遇到的问题是,当我单击任何标签时,会出现以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JRootPane cannot be cast to javax.swing.JLabel
at dealornodeal.ui.DealOrNoDealUI.mouseClicked(DealOrNoDealUI.java:628)
at java.awt.Component.processMouseEvent(Component.java:6528)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3322)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4542)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我可以看到mouseClicked()方法返回的是JRootPane组件而不是JLabel组件,而且JRootPane显然无法转换为JLabel。我的问题是,当使用mouseClicked()方法而不是JRootPane时,如何获取JLabel组件

下面是我的代码,我将向所有JLabel添加一个MouseListener,然后尝试在mouseClicked()上执行代码:

我正在为GUI使用空布局。

for(Component-Component:this.components){
这是问题的根源,我假设您正在将“标签”添加到
JFrame
,这将解释类强制转换异常

JFrame
(以及大多数顶级Swing容器)包含
JRootPane
,其中包含
contentPane
mennuBar
glassPane

基本上,您已经选择了
JRootPane
(是
JFrame
的唯一直接子项)并将您的
MouseListener
添加到其中

在不知道如何建立UI的情况下,不可能给出准确的建议,但在大多数情况下,您可能会使用工厂方法创建标签,用于进行基本初始化和配置,并返回
JLabel

protected JLabel makeLabel(String text) {
    JLabel label = new JLabel(text);
    label.addMouseListener(someInstanceOfAMouseListener);
    return label;
}
然后你可以调用这个方法,让标签,基本上,自动生成

另一种选择是将所有标签放入数组或列表中,并使用
for循环来管理它们

private JLabel[] listOfLabels;
//...
listOfLabels = new JLabel[count];
for (int index = 0; index < count; index++) {
    listOfLabels[index] = new JLabel(...);
    listOfLabels[index].addMouseListener(someInstanceOfAMouseListener);
}
private JLabel[]列表标签;
//...
listOfLabels=新的JLabel[count];
for(int index=0;index

或者它们的组合…

我已经使用GUI构建器创建了标签,因为我需要将它们放置在准确的位置,但我不知道如何将它们添加到JLabel数组中,因为迭代所有组件并过滤掉JLabel似乎不起作用。那么,您必须添加
鼠标列表ener
分别添加到每个标签。您可以使用类似于
JLabel listOfLabels[]=newjlabel[]{label1,label2,…}的内容创建数组;
“我有一个GUI,有大约26个不同的标签,但我希望在单击时能够为所有标签执行相同的代码,所以我想我会使用MouseStener和mouseClicked方法来执行代码。”首先,使用26(可能未修饰)带有单个
ActionListener
的按钮。按钮可以聚焦,可以接受键盘输入和鼠标单击。“我正在为GUI使用空布局。“Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作。在不同的地区使用不同的PLAF。因此,它们不利于像素完美的布局。相反,使用布局管理器,或者与布局填充和边框一起使用。
private JLabel[] listOfLabels;
//...
listOfLabels = new JLabel[count];
for (int index = 0; index < count; index++) {
    listOfLabels[index] = new JLabel(...);
    listOfLabels[index].addMouseListener(someInstanceOfAMouseListener);
}