gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:46 28 4
gpt4 key购买 nike

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

我的问题与这个问题完全相同:Disable TreeItem's default expand/collapse on double click JavaFX 2.2不幸的是,提供的答案不再有效(如果曾经有效的话)。

更新 1:不幸的是,我不知道重要的是我没有使用标准的 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树的 s。

示例:

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,您的 TreeItem 将具有标准的双击行为,但双击 ImageView 除外。

关于java - 双击时禁用 TreeItem 的默认展开/折叠 (JavaFX 8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46436974/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com