自定义TreeView:TreeCell中自定义标签的setOnAction

时间:2014-11-07 00:41:54

标签: checkbox javafx treeview listener

我制作了一个TreeView,由一个自定义的cellFactory表示,其中每个单元格都由一个HBox表示。

TreeCell HBox

如何访问该复选框,以便在检查时,相应的EventTreeItem中的私有布尔字段会更改它的值?

代码:

public class EventTreeItem extends TreeItem<String>{
    SimpleStringProperty item;
    boolean important = true;

    public EventTreeItem(boolean important, int id){
        this.noNode = noNode;
        super.setValue(id);
    }
    public EventTreeItem(){

    }

    public void setImportant(Boolean important){
        this.important = important;
    }
}

CellFactory:

public final class CustomTreeCellFactory extends TreeCell<String>{
private TextField textField;
private HBox hBox;
private HBox hBoxLeaf;

public CustomTreeCellFactory(){
    try {
        hBox = (HBox) FXMLLoader.load(getClass().getResource("/Views/TreCell.fxml"));
    } catch (IOException e) {
        System.out.println("This didn't work");
        e.printStackTrace();
    }
    try {
        hBoxLeaf = (HBox) FXMLLoader.load(getClass().getResource("/Views/TreCellLowestLevel.fxml"));
    } catch (IOException e) {
        System.out.println("This didn't work");
        e.printStackTrace();
    }
    hBox.setAlignment(Pos.CENTER_LEFT);
    hBoxLeaf.setAlignment(Pos.CENTER_LEFT);

}

@Override
public void updateItem(String item, boolean empty) {
   super.updateItem(item, empty);

    if (item != null) {
        EventTreeItem eventTreeItem = (EventTreeItem) getTreeItem();
        if (getTreeView().getTreeItemLevel(getTreeItem())==1) {
            setGraphic(this.hBox);
            ((CheckBox) ((HBox)getGraphic()).getChildren().get(3)).setSelected(((EventTreeItem) getTreeItem()).important);


           ((Label) hBox.getChildren().get(0)).setText(eventTreeItem.noNode.getEntryNumber() + " " + eventTreeItem.noNode.getClass().getName().split("\\.")[3]);
           ((Label) hBox.getChildren().get(1)).setText(eventTreeItem.noNode.getDate().toString());

        }else if (getTreeView().getTreeItemLevel(getTreeItem())==2){
            setGraphic(this.hBoxLeaf);
        }
    } else {
        setGraphic(null);
    }
}

}

NodeTreeView

public class NodeTreeView implements ChartView{
private FilteredListModel filteredListModel;
TreeItem<String> root;
AnchorPane parent;
TreeView treeView;

public NodeTreeView(FilteredListModel filteredListModel, TabPane tabPane) throws IOException {
    this.filteredListModel = filteredListModel;
    parent = (AnchorPane) FXMLLoader.load(getClass().getResource("/Views/TryTreeViewInAnchorPane.fxml"));
    parent.setVisible(true);
    generateTree();

    }


private void generateTree() {
        this.root = new EventTreeItem();
        root.setExpanded(true);
        filteredListModel.makeEventNodeArrays().forEach(node->{
            EventTreeItem item = new EventTreeItem((EventNoNode) node);
            EventTreeItem item2 = new EventTreeItem();
            root.getChildren().add(item);
            item.getChildren().add(item2);
        });



    treeView = (TreeView) parent.getChildren().get(0);
    treeView.setRoot(root);
    treeView.setShowRoot(false);
    treeView.setEditable(true);
    treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {
        @Override
        public TreeCell<String> call(TreeView<String> param) {
            return new CustomTreeCellFactory();
        }
    });

}

}

1 个答案:

答案 0 :(得分:1)

您可以在selectedProperty构造函数(不是工厂,btw;您应该将其称为CustomTreeCellFactory)中向复选框CustomTreeCell添加一个侦听器:

public CustomTreeCellFactory() {
    // ...
    CheckBox checkbox = ...;
    checkbox.selectedProperty().addListener((obs, wasSelected, isSelected) -> {
        ((EventTreeItem) getTreeItem()).important = isSelected;
    });
}
顺便说一下,做出重要的事情可能是一个更好的主意。 flag是项目的一部分,即代替TreeView<String>TreeView<MyItem> MyItem

class MyItem {
    String item;
    boolean important;

    MyItem(String item, boolean important) {
        this.item = item;
        this.important = important;
    }
}