我有一個具有CheckBoxes的幾個節點的TreeView(請參閱MWE)。摺疊/展開TreeView隨機檢查複選框
當摺疊/展開某個節點時,其他節點的複選框被選中或取消選中。
重現行爲,只需展開所有節點,檢查ChildA
,摺疊Block1
和ChildC
將被自動檢查。
package treeviewexample;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.CheckBoxTreeCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TreeViewExample extends Application {
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
/* example Treeview */
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);
/* add CheckBoxes */
tw.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
root.getChildren().add(tw);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如何防止此行爲?在我的程序稍後的一點,我想通過TreeView並獲得節點的狀態(選中或不選)以使用它們。
從https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TreeCell.html我瞭解以下內容:
由於該TreeCell從IndexedCell延伸其實,每個TreeCell還提供了一個index屬性。索引將隨着單元格展開和摺疊而更新,因此應被視爲視圖索引而不是模型索引。
那麼這是預期的行爲?爲什麼有人想要那樣?