【问题标题】:Customized TreeView: setOnAction for Custom Label in TreeCell自定义 TreeView:TreeCell 中自定义标签的 setOnAction
【发布时间】:2015-01-03 16:57:46
【问题描述】:

我制作了一个 TreeView,由一个自定义 cellFactory 表示,其中每个单元格都由一个看起来像这样的 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;
    }
}

细胞工厂:

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

}

}

【问题讨论】:

    标签: checkbox javafx treeview listener


    【解决方案1】:

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

    public CustomTreeCellFactory() {
        // ...
        CheckBox checkbox = ...;
        checkbox.selectedProperty().addListener((obs, wasSelected, isSelected) -> {
            ((EventTreeItem) getTreeItem()).important = isSelected;
        });
    }
    

    顺便说一句,将“重要”标志作为项目的一部分可能是一个更好的主意,即,而不是TreeView&lt;String&gt;,您将拥有TreeView&lt;MyItem&gt;,其中MyItem

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

    【讨论】:

    • 你成就了我的一天。工厂的命名真的让我很困惑。我不知道我为什么这样做。所有 HBox 项目都可以简单地在构造函数中声明,以及侦听器。我永远不会原谅自己。
    • 我是 StackOverflow 的新手,但我应该编辑我的 OP 来清理它吗?我应该用我的结果来回答我的问题吗?
    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2011-10-15
    • 2012-07-07
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多