2016-11-23 4 views
0

J'essaie de créer un TreeTableView modifiable à partir d'un document XML. Pour cela, j'emballe les éléments du document dans une classe. Les données des éléments sont stockées dans la clé d'attributs et val. Mon Wrapper se compose dePointeur nul sur la création d'un wrapper d'élément

private Element node; 

private final StringProperty key = new SimpleStringProperty(this, node.getAttribute("key"), "temp"); 
private final StringProperty val = new SimpleStringProperty(this, node.getAttribute("val"), "temp"); 

public ElementWrapper(Element n){ 
    System.out.println("creating element "+n.getNodeName()); 
    node = n; 
} 
public String getKey(){ 
    return key.get(); 
} 
@Override 
public String getVal(){ 
    return key.get(); 
} 
public void setKey(String key){ 
    ((Element)node).setAttribute("key", key); 
} 
@Override 
public void setVal(String value){ 
    ((Element)node).setAttribute("val", value); 
} 
@Override 
public Element getElement(){ 
    return node; 
} 
@Override 
public StringProperty keyProperty(){ 
    return key; 
} 
@Override 
public StringProperty valProperty(){ 
    return val; 
} 

j'ai écrit un algorithme récursif qui crée les éléments d'arbre et les met à

TreeItem<NodeWrapper> newsub = new TreeItem<>(new ElementWrapper(current)); 

où le courant est le élément XML. À ce stade, je reçois un NullPointerException pour lib.ElementWrapper.<init>(ElementWrapper.java:21) qui est la deuxième ligne de la classe Wrapper affichée ci-dessus. Comment régler ceci correctement?

Répondre

3

Modifier à:

private Element node; 

private final StringProperty key; 
private final StringProperty val; 

public ElementWrapper(Element n){ 
    System.out.println("creating element " + n.getNodeName()); 
    node = n; 
    key = new SimpleStringProperty(this, node.getAttribute("key")); 
    val = new SimpleStringProperty(this, node.getAttribute("val")); 
} 

Parce que ces initialisations sont effectuées avant d'exécuter costructor:

private final StringProperty key = new SimpleStringProperty(this, node.getAttribute("key"), "temp"); 
private final StringProperty val = new SimpleStringProperty(this, node.getAttribute("val"), "temp"); 

est ici question bien sur l'initialisation: Java order of Initialization and Instantiation.
Documentation officielle: Initializing Fields.

+0

Eh bien, cela semble être la raison avec le pointeur nul, seul problème que j'ai maintenant est que les éléments ne seront pas définis avec la valeur désirée de l'attribut. peut-être que je dois comprendre pourquoi ils ne voient que la valeur initiale – chenino

+0

@chenino Désolé, pourriez-vous fournir plus de détails ce qui ne va pas? –

+0

Trouvé la solution déjà, a fait une modification à votre réponse et l'a marqué. Si je place la dernière valeur sur la construction à null, les valeurs ne seraient pas mises à jour sur la table d'arbre. Fixé ceci, maintenant everythign travaille pour moi. Merci beaucoup Andrii! – chenino