yos*_*egg 3 java treeview javafx javafx-8
双击TreeView中的TreeItem时,如何禁用默认的展开/折叠行为?
我的问题与此问题完全相同:在双击JavaFX 2.2时禁用TreeItem的默认展开/折叠 不幸的是,提供的答案不再起作用(如果他们曾经这样做).
更新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);
}
Run Code Online (Sandbox Code Playgroud)
所以最终看到的是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();
}
}
Run Code Online (Sandbox Code Playgroud)
更新您的特定用例:
首先,你的TreeItem
实现真的很奇怪,因为它必须是这样的:
class BasicTreeItem extends TreeItem<HBox>
Run Code Online (Sandbox Code Playgroud)
使用GUI元素作为模型是一种不好的做法.您可以实现一个能够存储每个项目可以拥有的所有状态的类,并将该类用作实现的模型TreeView
,也可以作为通用参数BasicTreeItem
.
但是要回答更新问题:如果要双击时双击展开行为Label
,但如果ImageView
双击则不想拥有它.
在这种情况下,你可以[R EMOVE的CellFactory
完全并添加EventFilter
到ImageView
(在你如BasicTreeItem
构造函数):
stateIndicator.addEventFilter(MouseEvent.MOUSE_PRESSED, (MouseEvent e) -> {
if (e.getClickCount() % 2 == 0 && e.getButton().equals(MouseButton.PRIMARY))
e.consume();
});
Run Code Online (Sandbox Code Playgroud)
使用此fitler,您TreeItem
将拥有标准的双击行为,除非双击ImageView
.
归档时间: |
|
查看次数: |
658 次 |
最近记录: |