Java 将mouseClicked事件(MouseListener)与多个JLabel一起使用
我有一个GUI,有大约26个不同的标签,但我希望在单击时能够为所有标签执行相同的代码,所以我想我会使用MouseListener和mouseClicked方法来执行代码。我遇到的问题是,当我单击任何标签时,会出现以下错误: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
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);
}