java - 如何在单击 JLabel 时获取其变量名称

标签 java jlabel mouselistener

例如,我声明了一个名为 label1 的新 JLabel,我希望当我单击该标签时打印它的名称,然后打印 label1 这是我的代码..

JLabel label1 = new JLabel("test");
label1.addMouseListener(new MouseAdapter()
    {

        @Override
        public void mouseClicked(MouseEvent e) 
        {
           System.out.println(label1.getVariableName());
        }
    }

预期结果是:lable1 JLabel 是否有任何方法可以知道该 Label 的变量名称

最佳答案

没有这么简单的方法。想想看:单个 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尝试这样做,可能会有解决方法。

关于java - 如何在单击 JLabel 时获取其变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707468/

相关文章:

java - 使用 Jackson 将 JSON 反序列化为 JPA 托管实体

java - 将 JLabel 添加到我的钟面不起作用

Java Swing 通过单击创建椭圆形

java - 由于 NullPointerException,我的可执行 jar 文件无法运行

java - 仅在 Java 代码中构建 HTML

java - .setLocation 和 .setBounds 不适用于 JLabel! (和 JButton)

java - 重叠 AWT 行和 Swing JLabel

java - 获取一个 JTextField 返回透明状态

java - 如何使用 MouseListener 和 MouseMotionListener 进行绘制

java - 为什么下面的生产者消费者代码不需要volatile变量?