ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

双击时禁用TreeItem的默认展开/折叠(JavaFX 8)

2019-08-28 09:00:30  阅读:848  来源: 互联网

标签:java javafx javafx-8 treeview


双击TreeView中的TreeItem时,如何禁用默认的展开/折叠行为?

我的问题与这个问题完全相同:Disable TreeItem’s default expand/collapse on double click JavaFX 2.2
不幸的是,提供的答案不再适用(如果他们曾经这样做).

更新1:
不幸的是,我不知道重要的是要提到我不使用标准的TreeItem,而是使用标准的TreeItem.它的构造函数如下所示:

public BasicTreeItem(String text) {
  super();

  _label = new Label(text);
  stateIndicator = new ImageView();
  this.setToNever(); // sets the stateIndicator mentioned above

  _hb = new HBox();
  this.setValue(_hb);
  _hb.getChildren().add(stateIndicator);
  _hb.getChildren().add(_label);
  _hb.setAlignment(Pos.CENTER_LEFT);
}

所以最终看到的是HBox.

解决方法:

例如,您可以使用TreeView的CellFactory将鼠标侦听器上的EventFilter附加到树的TreeCell.

例:

public class TreeViewExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();

        TreeView tw = new TreeView();
        TreeItem rootNode = new TreeItem("Root");
        TreeItem blockOne = new TreeItem("Block1");
        TreeItem childA = new TreeItem("ChildA");
        TreeItem childB = new TreeItem("ChildB");
        blockOne.getChildren().add(childA);
        blockOne.getChildren().add(childB);
        TreeItem blockTwo = new TreeItem("Block2");
        TreeItem childC = new TreeItem("ChildC");
        TreeItem childD = new TreeItem("ChildD");
        blockTwo.getChildren().add(childC);
        blockTwo.getChildren().add(childD);
        rootNode.getChildren().add(blockOne);
        rootNode.getChildren().add(blockTwo);
        tw.setRoot(rootNode);


        tw.setCellFactory(param -> {
            TreeCell<String> treeCell = new TreeCell<String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (item == null || empty) {
                        setText("");
                        setGraphic(null);
                        return;
                    }

                    setText(item.toString());
                }
            };

            treeCell.addEventFilter(MouseEvent.MOUSE_PRESSED, (MouseEvent e) -> {
                if (e.getClickCount() % 2 == 0 && e.getButton().equals(MouseButton.PRIMARY))
                    e.consume();
            });
            return treeCell;
        });

        root.getChildren().add(tw);
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("TreeView!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

更新您的特定用例:

首先,你的TreeItem实现真的很奇怪,因为它必须是这样的:

class BasicTreeItem extends TreeItem<HBox>

使用GUI元素作为模型是一种不好的做法.您可以实现一个能够存储每个项目可以拥有的所有状态的类,并将该类用作TreeView的模型,也可以作为BasicTreeItem实现的通用参数.

但要回答更新问题:如果要双击Label时双击展开行为,但如果双击ImageView,则不想使用它.

在这种情况下,您可以完全删除CellFactory并将EventFilter添加到ImageView(例如,在BasicTreeItem构造函数中):

stateIndicator.addEventFilter(MouseEvent.MOUSE_PRESSED, (MouseEvent e) -> {
    if (e.getClickCount() % 2 == 0 && e.getButton().equals(MouseButton.PRIMARY))
        e.consume();
});

使用此fitler,除了双击ImageView之外,TreeItem将具有标准的双击行为.

标签:java,javafx,javafx-8,treeview
来源: https://codeday.me/bug/20190828/1750269.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有