从另一个类添加声明组件的动作侦听器

时间:2013-01-30 08:29:46

标签: java swing actionlistener

在这里,我想在B类中注册newBTN的动作监听器。

注意:: newBTN未添加且未初始化。此外,A级不受我的控制,无法更改。

class A {
    private JButton newBTN = null;
}

如何访问A类的newBTN,以便从B类注册newBTN的动作监听器?

class B {
}

2 个答案:

答案 0 :(得分:2)

Reflection将允许您访问现有类的字段。

警告:这是非常不良做法,您应该尝试在开始这条路径之前探索所有可能的途径。这可能严重会破坏您正在访问的类的功能。你必须问自己,“为什么这个领域是私人的?”

public class TestReflection {

    public static void main(String[] args) {
        new TestReflection();
    }

    public TestReflection() {

        PrivateAccessOnly instance = new PrivateAccessOnly();

        try {
            Field field = PrivateAccessOnly.class.getDeclaredField("field");
            field.setAccessible(true);
            System.out.println("Current value = " + field.get(instance));
            field.set(instance, new JButton("Testing"));
            System.out.println("New value = " + field.get(instance));
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException exp) {
            exp.printStackTrace();
        }

    }

    public class PrivateAccessOnly {

        private JButton field;

    }
}

答案 1 :(得分:0)

您需要考虑很多事情。

  1. A类的实例应该可以被B类访问,或者B类的实例应该能够创建A类的实例。
  2. 在A类中创建按钮实例。
  3. 在A类中写入“getter”方法,它将返回A中的按钮实例(请记住,在此之前必须完成第2步。如果你没有在A类中创建按钮实例,你将从getter返回null方法,它将导致NullPointerException)。
  4. 从B类实例中调用此getter方法。
  5. 在getter方法返回的按钮对象上添加动作侦听器。