[英]Disable TreeItem's default expand/collapse on double click JavaFX 2.2
[英]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.