JavaFX8 TreeView鼠标单击树的最后一个节点

JavaFX8 TreeView鼠标单击树的最后一个节点,javafx,treeview,mouseevent,Javafx,Treeview,Mouseevent,我有一个多级树状视图。它有几个树项目。我加载时只扩展一个级别。用户可以通过单击树项目的箭头逐个展开。随着我不断扩展,最后一个节点不断向下移动并离开视图端口。我向下滚动,然后单击箭头。我得到了错误 @FXML private void createDescendantsTreeView(TreeView<APerson> thisTreeView) { AnchorPane.setTopAnchor(thisTreeView, 10.0);

我有一个多级树状视图。它有几个树项目。我加载时只扩展一个级别。用户可以通过单击树项目的箭头逐个展开。随着我不断扩展,最后一个节点不断向下移动并离开视图端口。我向下滚动,然后单击箭头。我得到了错误

    @FXML
    private void createDescendantsTreeView(TreeView<APerson> thisTreeView) {

        AnchorPane.setTopAnchor(thisTreeView, 10.0);
        AnchorPane.setBottomAnchor(thisTreeView, 10.0);
        AnchorPane.setLeftAnchor(thisTreeView, 5.0);
        AnchorPane.setRightAnchor(thisTreeView, 5.0);
        thisTreeView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
        thisTreeView.setPrefHeight(vBoxHt);

        thisTreeView.setCellFactory(new Callback<TreeView<APerson>, TreeCell<APerson>>() {
            @Override
            public TreeCell<APerson> call(TreeView<APerson> thisTreeView) {
                return new TreeCell<APerson>() {
                    protected void updateItem(final APerson thisPerson, boolean empty) {

                        super.updateItem(thisPerson, empty);
                        // if the item is not empty and is a root...
                        if (!empty) {
                            setTooltip(thisPerson.getToolTip());
// This will set Context menu for the node
                            if (thisPerson.getFatherID() != 0) {
                                this.setContextMenu(rightContextMenu);
                            }

                            if (thisPerson.getGender().charAt(0) == 'M') {
                                setText(thisPerson.getPersonName() + " [" + thisPerson.getPersonID() + "]");
                                ImageView maleIcon = new ImageView(maleImage);
                                setGraphic(maleIcon);
                                String cellStyle = "    -fx-font-size: 16;\n" + "    -fx-font-family: \"Times New Roman\";\n" + "-fx-text-fill: blue;";
                                setStyle(cellStyle);
                            } else {
                                setText(thisPerson.getPersonName() + " [" + thisPerson.getPersonID() + "]");
                                ImageView femaleIcon = new ImageView(femaleImage);
                                setGraphic(femaleIcon);
                                String cellStyle = "    -fx-font-size: 16;\n" + "    -fx-font-family: \"Times New Roman\";\n" + "-fx-text-fill: red;";
                                setStyle(cellStyle);
                            }
                        } else {
                            this.setText(null);
                            this.setGraphic(null);
                        }
                    }
                };
            }
        });

        childrenTreeView.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                Node node = mouseEvent.getPickResult().getIntersectedNode();
                    System.out.println("Node click: " + node.toString());

                if (node instanceof Text || (node instanceof TreeCell && ((TreeCell) node).getText() != null)) {
                    TreeItem TreeItemAtLocation = new TreeItem();
                    TreeItemAtLocation = childrenTreeView.getSelectionModel().getSelectedItem();
                    System.out.println("Child Tree - clicked on : " + TreeItemAtLocation.getValue().toString());
                    String name = childrenTreeView.getSelectionModel().getSelectedItem().getValue().toString();
                    APerson tmp = childrenTreeView.getSelectionModel().getSelectedItem().getValue();
                    if (TreeItemAtLocation.getParent() == null) {
                        removePicture.setDisable(true);
                    } else {
                        removePicture.setDisable(false);
                    }
                    if (mouseEvent.getButton().equals(MouseButton.SECONDARY)) {
                        if (TreeItemAtLocation != null) {
                            if (childrenTreeView.getRoot() == TreeItemAtLocation) {
                                addPerson.setDisable(false);
                                deletePerson.setDisable(true);
                                deleteThisFamily.setDisable(true);
                                modifyPerson.setDisable(true);
                                viewPerson.setDisable(true);
                            } else {
                                addPerson.setDisable(false);
                                deletePerson.setDisable(false);
                                if (TreeItemAtLocation.isLeaf()) {
                                    deleteThisFamily.setDisable(true);
                                } else {
                                    deleteThisFamily.setDisable(false);
                                }
                                modifyPerson.setDisable(false);
                                viewPerson.setDisable(false);
                            }
                            rightContextMenu.show(myMainApp.getMainStage());
                        } else {
                            rightContextMenu.hide();
                        }
                    } else {
                        rightContextMenu.hide();
                    }
                }
            }
        });
    }
@FXML
私有void CreateGenderantStreeView(树视图此树视图){
AnchorPane.setTopAnchor(thisTreeView,10.0);
AnchorPane.setBottomAnchor(thisTreeView,10.0);
AnchorPane.setLeftAnchor(thisTreeView,5.0);
AnchorPane.setRightAnchor(thisTreeView,5.0);
thisTreeView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
thisTreeView.setPrefHeight(vBoxHt);
thisTreeView.setCellFactory(新回调(){
@凌驾
公共TreeCell呼叫(TreeView thisTreeView){
返回新的TreeCell(){
受保护的void updateItem(此人的最终文件,布尔值为空){
super.updateItem(此人,空);
//如果项目不是空的并且是根目录。。。
如果(!空){
setTooltip(thisPerson.getToolTip());
//这将为节点设置上下文菜单
if(thisPerson.getFatherID()!=0){
此.setContextMenu(rightContextMenu);
}
if(thisPerson.getGender().charAt(0)='M'){
setText(thisPerson.getPersonName()+“[”+thisPerson.getPersonID()+“]);
ImageView maleIcon=新ImageView(maleImage);
设置图形(maleIcon);
String cellStyle=“-fx字体大小:16;\n“+”-fx字体系列:\“Times New Roman\”;\n“+”-fx文本填充:蓝色;”;
设置样式(单元样式);
}否则{
setText(thisPerson.getPersonName()+“[”+thisPerson.getPersonID()+“]);
ImageView femaleIcon=新的ImageView(femaleImage);
设置图形(femaleIcon);
String cellStyle=“-fx字体大小:16;\n“+”-fx字体系列:\“Times New Roman\”;\n“+”-fx文本填充:红色;”;
设置样式(单元样式);
}
}否则{
this.setText(null);
此.setGraphic(null);
}
}
};
}
});
setOnMouseClicked(新的EventHandler()){
@凌驾
公共无效句柄(MouseEvent MouseEvent){
Node Node=mouseEvent.getPickResult().getIntersectedNode();
System.out.println(“节点点击:+Node.toString());
if(Text的节点实例| |(TreeCell的节点实例&((TreeCell)节点).getText()!=null)){
TreeItem TreeItemLocation=新的TreeItem();
TreeItemLocation=childrenTreeView.getSelectionModel().getSelectedItem();
System.out.println(“点击的子树:+treeitemattlocation.getValue().toString());
字符串名称=childrenTreeView.getSelectionModel().getSelectedItem().getValue().toString();
APerson tmp=childrenTreeView.getSelectionModel().getSelectedItem().getValue();
if(treeItemLocation.getParent()==null){
removePicture.setDisable(true);
}否则{
removePicture.setDisable(false);
}
if(mouseEvent.getButton().equals(MouseButton.SECONDARY)){
if(treeItemLocation!=null){
if(childrenTreeView.getRoot()==treeItemLocation){
addPerson.setDisable(false);
deletePerson.setDisable(true);
deleteThisFamily.setDisable(true);
modifyPerson.setDisable(true);
viewPerson.setDisable(true);
}否则{
addPerson.setDisable(false);
deletePerson.setDisable(false);
if(treeItemLocation.isLeaf()){
deleteThisFamily.setDisable(true);
}否则{
deleteThisFamily.setDisable(false);
}
modifyPerson.setDisable(false);
viewPerson.setDisable(false);
}
show(myMainApp.getMainStage());
}否则{
rightContextMenu.hide();
}
}否则{
rightContextMenu.hide();
}
}
}
});
}
此图显示屏幕和我正在谈论的右侧的树。当我继续展开节点时,最后一个树项目向下滚动,在该图像中不可见。我向下滚动查看该树项目,当我单击该树项目的箭头时,我得到以下错误

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException Node click: MainWindowController$5$1@1051fb6[styleClass=cell indexed-cell tree-cell]'Daughter [363]' at familytreev01.MainWindowController$6.handle(MainWindowController.java:510) at familytreev01.MainWindowController$6.handle(MainWindowController.java:501) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470) at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398) at javafx.scene.Scene$MouseHandler.process(Scene.java:3766) at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$355(GlassViewEventHandler.java:388) at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387) at com.sun.glass.ui.View.handleMouseEvent(View.java:555) at com.sun.glass.ui.View.notifyMouse(View.java:937) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191) at java.lang.Thread.run(Thread.java:745) Node click: MainWindowController$5$1@36f8bc[styleClass=cell indexed-cell tree-cell]'null' Node click: StackPane@b679e7[styleClass=tree-disclosure-node] Deleting directory D:\JavaFXPrograms\FamilyTreeV01\dist\run8821460 jfxsa-run: BUILD SUCCESSFUL (total time: 16 minutes 1 second) 线程“JavaFX应用程序线程”java.lang.NullPointerException中的异常 节点单击:MainWindowController$5$1@1051fb6[styleClass=单元索引单元树单元]'子单元[363]' 位于familytreev01.MainWindowController$6.handle(MainWindowController.java:510) 在familytreev01.MainWindowController$6.handle(MainW