例如,我宣布了一个名为JLabel
的新label1
,我希望当我点击该标签打印其名称然后打印label1
时,这是我的代码。
JLabel label1 = new JLabel("test");
label1.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
System.out.println(label1.getVariableName());
}
}
预期结果为:lable1
有没有JLabel
知道Label
答案 0 :(得分:3)
没有这么简单的方法。想一想:单个JLabel
对象可以被许多单独的变量名称引用:
JLabel label1 = new JLabel("test");
JLabel label2 = label1;
JLabel label3 = label2;
或者它根本没有变量名 :
frame.getContentPane().add(new JLabel("test"));
frame.getContentPane().getComponent(0).addMouseListener(new MouseAdapter() { ... });
此外,并非所有变量名都在运行时存在。字段名称,但局部变量名称(在方法内)不;它们只存在于源代码中,而不存在于编译的字节码中。
如果您的变量是类中的字段,那么您可以使用reflection迭代对象的字段并找到具有所需值的字段:
try {
for (java.lang.reflect.Field f : yourObject.getClass().getDeclaredFields()) {
f.setAccessible(true);
if (f.get(yourObject) == label1) {
System.out.println(f.getName());
}
}
} catch (Throwable t) {
throw new RuntimeException(t);
}
(其中yourObject
是声明字段的类的实例;例如JFrame
)。
使用反射是非常丑陋的,除了调试之外,不应该将它用于任何事情。
否则,请详细说明您actually尝试做什么,可能会有解决方法。
答案 1 :(得分:0)
这可以通过反射解决,但这不是一件好事。解决此问题的另一种方法是维持Map
<Unique ID of a label>
- &gt; <The variable name>
。
当然,每次更改变量名称时都必须更新地图,但它可能适用于您。