我正在使用customButtons作为加载JButton的容器。我通过名称获取按钮(但是通过配置文件):
getComponent("btn1");
我已经这样做了,有一个漂亮的按钮列表,一个简单的函数概述,以及对正确的面板“jpt”的引用,以获得编译器给我的所有帮助。
按钮的顺序,数量和选择也需要由非程序员配置 - 我发现一个按钮变量名称列表才能正常工作。
问题是:Netbeans 7.4给我警告“在构造函数中泄漏这个”(第9行),这是真的,因为我这样做。有没有更正确的方法来实现相同的结果?
public class CustomButtons extends javax.swing.JPanel {
CustomJPanel jpt;
HashMap<String, Component> components;
public CustomButtons (CustomJPanel jpt) {
this.jpt = jpt;
initComponents();
components = getAllComponentsInContainer(this);
}
public Component getComponent(String name) {
return components.get(name);
}
private HashMap<String, Component> getAllComponentsInContainer(Container root) {
HashMap<String, Component> comps = new HashMap<>();
for (Component c : root.getComponents()) {
comps.put(c.getName(), c);
if (c instanceof Container) {
comps.putAll(getAllComponentsInContainer((Container) c));
}
}
return comps;
}
答案 0 :(得分:0)
如果getComponents()
保证在您拨打getAllComponentsInContainer(this)
时初始化,您可能不会过于担心警告 - 主要是警告您实例不可能尚未完全初始化。
如果您想避免出现警告,可以将getAllComponentsInContainer
更改为仅接受getComponents()
的结果:
components = getAllComponents(getComponents());
...
private HashMap<String, Component> getAllComponents(Component[] containerComponents) {
HashMap<String, Component> comps = new HashMap<>();
for (Component c : containerComponents) {
comps.put(c.getName(), c);
if (c instanceof Container) {
comps.putAll(getAllComponents((Container) c).getComponents());
}
}
return comps;
}
或者,您可以,例如,在构造函数完成后需要在您的类中添加initialise
方法(但这意味着您可能会忘记在某处调用它):
public void initialise() {
components = getAllComponents(getComponents());
}
答案 1 :(得分:0)
你可以只在构造函数中放置方法getAllComponentsInContainer的实现,并将所有实例变量设置为你是作者的同一个类,我不能编写精确的实现,因为不确定你在initComponents()方法中做了什么。