0

TreeTableViewXML ドキュメントから編集可能なドキュメントを作成しようとしています。このために、クラス内のドキュメントから要素をラップしています。要素のデータは、属性 key および val 内に格納されます。私のラッパーはで構成されています

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;
}

ツリー項目を作成し、それらを設定する再帰アルゴリズムを作成しました

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

current は XML 要素です。この時点で、上記のクラス の 2 行目のNullPointerExceptionfor を取得します。これを正しく設定するにはどうすればよいですか?lib.ElementWrapper.<init>(ElementWrapper.java:21)Wrapper

4

1 に答える 1

3

次のように変更します。

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"));
}

これらの初期化は、コストラクタを実行する前に行われるため:

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

ここに初期化に関する良い質問があります: Java order of Initialization and Instantiation
公式ドキュメント: Initializing Fields

于 2016-11-23T14:42:53.430 に答える