有一个JPanel包含一些JTextFields,一个map包含所有JTextFields的名称(变量的名称)。我想将地图的值设置为JTextFields的文本。
public void mapToJPanel(Map map, JPanel panel) {
Component[] compArr = panel.getComponents();
for (Component comp : compArr) {
if (comp.getClass().getSimpleName().equals("JTextField")) {
JTextField textField = (JTextField) comp;
textField.setText(map.get(textField.getName()).toString());//getName() method
}
}
}
通过getName()方法,我得到null -_-我知道getName()方法不用于获取变量名。 我正在使用netbeans进行Java swing可视化开发,所以我无法重写组件(如JTextField)。
答案 0 :(得分:16)
你不能,因为一个对象没有名字。请考虑以下示例:
A a = new A();
A b = a;
现在A
个实例的“名称”是什么?是"a"
吗?是"b"
吗?
那怎么样?
A[] a = new A[] { new A(), new A()};
a[0] = a[1];
a[1]
处的实例的“名称”是什么?
我的观点是,您无法提供适用于各种上下文的通用Java对象名称的有用/可用定义。包版问题包括:
Java最接近对象名称的是对象的“身份哈希码”值。它不是唯一的,但它具有在当前JVM中对象的生命周期内不会更改的属性。 (但即使是身份哈希码也会以运行时成本出现......这使得某些人认为这是一个Java设计错误。)
命名对象的明智方法是(正如其他人所说的)将“名称”字段添加到相关类(或使用现有字段)并根据需要自己管理名称。
在“对象”实际上是JComponent
的更具体的情况下,不能依赖给定的组件来获得名称。 (getName()
方法可以返回null
。)但是,如果您愿意,可以遍历任何JComponent
层次结构,并根据需要在任何组件上设置名称。
答案 1 :(得分:6)
你不能。
如果使用调试符号进行编译,那么.class文件将包含一个变量名表(这是调试器将变量映射回源代码的方式),但是不能保证它会存在,并且它不会在运行时公开
答案 2 :(得分:6)
您可以使用Component.setName()
为Swing和AWT组件命名。
答案 3 :(得分:1)
你不能,如果你需要这样做,你似乎做错了什么。但是,如果您真的想要追求您概述的逻辑,为什么不执行以下操作:
将一个String成员添加到A并在构造函数中指定它。像这样:
A a = new A('a');
答案 4 :(得分:0)
虽然您可以通过调用.getClass()。getCanonicalName()或.getClass()。getSimpleName()(取决于您是否需要完全限定名称)轻松获取变量类的名称,但这并不容易获取变量的名称。 Java字节码不需要保留局部变量的名称(使用堆栈上的push / pop操作表示);但是,Java字节码可能包含注释中的原始名称。因此,您可以尝试从.jar文件中读取.class文件,并尝试从.class文件中提取变量名称,假设编译器已将它们作为注释包含在内。对于成员变量(即字段),您可以使用反射来获取类的字段名称。
答案 5 :(得分:0)
复制名称(符号)a是不方便的,有点吵。 在具有宏的语言中,可以定义它,以便在源代码程序中自动复制。
make(A, a);
或 makeA(a)中
答案 6 :(得分:0)
您可以尝试定义一个新的Object,它扩展(显式或仅在函数中)原始Object,并为Object的名称添加一个新的String字段。然后提供在需要时获取该名称的方法。这种方法对我来说效果很好。
答案 7 :(得分:0)
您始终可以在对象的类中创建名称变量,并使用其他变量来传递有关此对象的信息。
答案 8 :(得分:-1)
我有同样的问题,看看那个解决方案......
DocumentoMB mb = new DocumentoMB();
System.out.println(mb.getClass().getSimpleName());