表格单元格中的Java FX8 TreeView [英] Java FX8 TreeView in a table cell

查看:117
本文介绍了表格单元格中的Java FX8 TreeView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个基于表格单元格中的TreeView的后续问题Java FX 8

我有一张表,其中特定列必须在点击时弹出树视图。

I am having a table in which a particular column has to popup a treeview on click.

我正在定义表列的cellfactory,如下所示

I am defining the table column's cellfactory as follows

        col4.setCellFactory(new Callback<TableColumn<User,DepartmentTree>, TableCell<User,DepartmentTree>>() {

        @Override
        public TableCell<User, DepartmentTree> call(
                TableColumn<User,DepartmentTree> param)
        {   
            TableCell<User, DepartmentTree> deptCombo = new TableCell<User,DepartmentTree>()
            {
                @Override                   
                public void startEdit()
                {
                    setGraphic(testtree);
                }

                @Override
                public void cancelEdit()
                {
                    setGraphic(null);
                    setText("");
                }

                @Override
                public void updateItem(DepartmentTree item, boolean empty)
                {

                    super.updateItem(item, empty);
                    setText(item.nameProperty().get());

                }


            };
            return deptCombo;
        }
    });

这导致树视图按照第一张图像显示在单元格内。但是我希望树视图像第二个图像一样弹出单元格(第二个图像是使用组合框内的树视图的不正确实现)

This is resulting in the treeview appearing inside the cell as per the first image. However I would like the treeview to popout of the cell like the second image (the second image is an incorrect implementation using the treeview inside a combobox)

弹出窗口是否显示为仅仅造型还是我必须修改任何代码?

Does the popout appear by mere styling or do I have to modify any code?

任何指导都会有所帮助。

Any guidance will be helpful.

推荐答案

我已经创建了自己的TreeViewPopupTableCell类来执行此操作。基本上你得到的是,当左键单击一个表单元格时(第一次单击将选择行,第二次将选择单元格),你会得到一个加载了树视图的弹出窗口。

I have created my own class of TreeViewPopupTableCell to do this. Basically what you get is, when a table cell is left clicked (first click will choose the row,second will choose the cell) you get a popup with a treeview loaded in it.

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.PopupControl;
import javafx.scene.control.Skin;
import javafx.scene.control.Skinnable;
import javafx.scene.control.TableCell;
import javafx.scene.control.TreeItem;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;

public class TreeViewPopupTableCell<S, T extends HierarchyData<T>> extends
        TableCell<S, T>
{
    private static final String DEFAULT_STYLE_CLASS = "combo-box-popup";
    private PopupControl popup;
    private TreeViewWithSetItems<T> treeviewSetItems;
    private static final Logger log = Logger.getLogger(TreeViewPopup.class);
    private ObservableList<T> treeList;
    private double popupXlocation = 0.0;
    private double popupYlocation = 0.0;

    public TreeViewPopupTableCell(T hierarchyObj)
    {
        treeviewSetItems = new TreeViewWithSetItems<>(new TreeItem<T>());
        treeList = FXCollections.observableArrayList();
        treeList.add(hierarchyObj);
        treeviewSetItems.setShowRoot(false);
        treeviewSetItems.setItems(treeList);
        treeviewSetItems.getStyleClass().add(DEFAULT_STYLE_CLASS);

        this.addEventHandler(MouseEvent.MOUSE_CLICKED,
                new EventHandler<MouseEvent>() {

                    @Override
                    public void handle(MouseEvent event)
                    {
                        popupXlocation = event.getScreenX();
                        popupYlocation = event.getScreenY();
                    }
                });
        treeviewSetItems.addEventHandler(KeyEvent.KEY_PRESSED,
                new EventHandler<KeyEvent>() {

                    @Override
                    public void handle(KeyEvent event)
                    {
                        if (event.getCode().equals(KeyCode.ESCAPE))
                        {

                            popup.hide();
                        }
                    }
                });

        treeviewSetItems.getSelectionModel().selectedItemProperty()
                .addListener(new ChangeListener<TreeItem<T>>() {

                    @Override
                    public void changed(
                            ObservableValue<? extends TreeItem<T>> observable,
                            TreeItem<T> oldValue, TreeItem<T> newValue)
                    {
                        if (oldValue == null)
                            return;
                        log.debug("Value changed");
                        popup.hide();
                        commitEdit(newValue.getValue());
                    }

                });

    }

    @Override
    public void startEdit()
    {

        T ChosenObject = this.getTableColumn().getCellData(
                this.getTableRow().getIndex());
        treeviewSetItems.getSelectionModel().select(
                treeviewSetItems.getindexofItem(ChosenObject));
        popup = new PopupControl();
        popup.getStyleClass().add(DEFAULT_STYLE_CLASS);
        popup.setAutoHide(true);
        popup.setAutoFix(true);

        popup.setHideOnEscape(true);
        popup.setX(popupXlocation);
        popup.setY(popupYlocation);
        popup.setSkin(new Skin<Skinnable>() {
            @Override
            public Skinnable getSkinnable()
            {
                return null;
            }

            @Override
            public Node getNode()
            {
                return treeviewSetItems;
            }

            @Override
            public void dispose()
            {
            }
        });
        popup.show(this.getScene().getWindow());
    }

    @Override
    public void cancelEdit()
    {
        log.debug("Cancel edit is being called");
    }


    @Override
    public void updateItem(T item, boolean empty)
    {
        super.updateItem(item, empty);
        setText(item.nameProperty().get());
    }

}

public interface HierarchyData<T extends HierarchyData> {
    /**
     * The children collection, which represents the recursive nature of the hierarchy.
     * Each child is again a {@link HierarchyData}.
     *
     * @return A list of children.
     */
    ObservableList<T> getChildren();
    StringProperty nameProperty();
}

要使用此单元格,请在tableview中设置cellfactory,如下所示。

To use this cell, in your tableview set the cellfactory as follows.

col4.setCellFactory(new Callback<TableColumn<S,T>, TableCell<S,T>>() {

    @Override
    public TableCell<S, T> call(
            TableColumn<S,T> param)
    {   
        return new TreeViewPopupTableCell<S, T>(T obj);
    }
}

这篇关于表格单元格中的Java FX8 TreeView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆