如何在单击时获取JLabel的变量名称

时间:2014-12-30 14:46:21

标签: java jlabel mouselistener

例如,我宣布了一个名为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

变量名称的方法

2 个答案:

答案 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>

当然,每次更改变量名称时都必须更新地图,但它可能适用于您。