簡體   English   中英

雙擊時禁用TreeItem的默認展開/折疊(JavaFX 8)

[英]Disable TreeItem's default expand/collapse on double click (JavaFX 8)

雙擊TreeView中的TreeItem時,如何禁用默認的展開/折疊行為?

我的問題與此問題完全相同: 在雙擊JavaFX 2.2時禁用TreeItem的默認展開/折疊不幸的是,提供的答案不再起作用(如果他們曾經這樣做)。

更新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。

例如,您可以使用CellFactory的的TreeView一個附加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將具有標准的雙擊行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM