Exception JavaFX禁用树视图折叠

Exception JavaFX禁用树视图折叠,exception,javafx,tree,Exception,Javafx,Tree,在JavaFX中,当我使用TreeView时,每当我单击主菜单(有子菜单)时,它们有时会“卡住”,不显示它们的子菜单 在10次点击中,7次可以,3次不行。我观察到,只有当我点击我所在的另一个主菜单时,问题才会出现。例如: >File New File Open File Close >Tools Settings 所以,如果我单击:File,它会显示它的子菜单(新建、打开、关闭)。如果我再次单击它,它将关闭子菜单

在JavaFX中,当我使用TreeView时,每当我单击主菜单(有子菜单)时,它们有时会“卡住”,不显示它们的子菜单

在10次点击中,7次可以,3次不行。我观察到,只有当我点击我所在的另一个主菜单时,问题才会出现。例如:

>File
   New File
   Open File
   Close
>Tools
   Settings
所以,如果我单击:File,它会显示它的子菜单(新建、打开、关闭)。如果我再次单击它,它将关闭子菜单<但是

当我单击另一个子菜单时,就像“设置”一样,单击文件(展开或折叠其子菜单)后,我会收到以下错误消息:

java.lang.NullPointerException
at utiokos_program.FoablakController$1.changed(FoablakController.java:166)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:196)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
at javafx.beans.property.ReadOnlyObjectWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyObjectWrapper.java:195)
at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:161)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:130)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at javafx.scene.control.SelectionModel.setSelectedItem(SelectionModel.java:101)
at javafx.scene.control.MultipleSelectionModelBase$1.invalidated(MultipleSelectionModelBase.java:65)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:155)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
at javafx.beans.property.ReadOnlyIntegerWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyIntegerWrapper.java:195)
at javafx.beans.property.ReadOnlyIntegerWrapper.fireValueChangedEvent(ReadOnlyIntegerWrapper.java:161)
at javafx.beans.property.IntegerPropertyBase.markInvalid(IntegerPropertyBase.java:130)
at javafx.beans.property.IntegerPropertyBase.set(IntegerPropertyBase.java:163)
at javafx.scene.control.SelectionModel.setSelectedIndex(SelectionModel.java:67)
at javafx.scene.control.MultipleSelectionModelBase.shiftSelection(MultipleSelectionModelBase.java:253)
at javafx.scene.control.TreeView$TreeViewBitSetSelectionModel$2.handle(TreeView.java:1114)
at javafx.scene.control.TreeView$TreeViewBitSetSelectionModel$2.handle(TreeView.java:1059)
at com.sun.javafx.scene.control.WeakEventHandler.handle(WeakEventHandler.java:62)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.control.TreeItem.fireEvent(TreeItem.java:713)
at javafx.scene.control.TreeItem.access$300(TreeItem.java:197)
at javafx.scene.control.TreeItem$5.invalidated(TreeItem.java:529)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:127)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:161)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:81)
at javafx.scene.control.TreeItem.setExpanded(TreeItem.java:509)
at com.sun.javafx.scene.control.behavior.TreeCellBehavior.doSelect(TreeCellBehavior.java:192)
at com.sun.javafx.scene.control.behavior.TreeCellBehavior.mousePressed(TreeCellBehavior.java:122)
at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:335)
at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3369)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3209)
at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3164)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1582)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2267)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292)
at com.sun.glass.ui.View.handleMouseEvent(View.java:530)
at com.sun.glass.ui.View.notifyMouse(View.java:924)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:17)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:67)
at java.lang.Thread.run(Thread.java:744)
当我再次点击它,它是好的,它再次显示我的潜艇!(从现在起,该文件是我最后一次单击的文件,而不是设置)

//一个可能的解决方案是禁用treeview的折叠,然后我每次都在扩展模式下使用它。是否可以在JavaFX Treeview中禁用折叠功能?

//我根据请求复制整个FoablakController.java

import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.application.Platform;
import javafx.scene.layout.StackPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.Node;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.Event;
import javafx.event.EventDispatchChain;
import javafx.event.EventDispatcher;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.input.ContextMenuEvent;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;

public class FoablakController implements Initializable {

     public Windows operation = null;    

        private final Node fileicon =  new ImageView(new Image(getClass().getResourceAsStream("file.png")));
        private final Node editicon =  new ImageView(new Image(getClass().getResourceAsStream("edit.png")));
        private final Node windowsicon =  new ImageView(new Image(getClass().getResourceAsStream("windows.png")));
        private final Node toolsicon =  new ImageView(new Image(getClass().getResourceAsStream("tools.png")));
        private final Node helpicon =  new ImageView(new Image(getClass().getResourceAsStream("help.png")));


    @FXML 
    public static StackPane menuholder;
    @FXML 
    public static StackPane main_right;
    @FXML
    public static StackPane help_right;
    @FXML
    public static StackPane contact_right;
    @FXML
    public static StackPane settings_right;
    @FXML
    public static StackPane contrast_right;
    @FXML
    public static StackPane comments_right;
    @FXML
    public static StackPane nice_right;
    @FXML
    public static StackPane faq_right;
    @FXML 
    public TextArea summary;    
    @FXML 
    public static TextArea textArea_help_summary;  
    @FXML 
    public Button btn_print;        


    @FXML
    public void Quitgomb (ActionEvent event) {
         Platform.exit();
          }



    public void ClearScreen(){
      main_right.setVisible(false);
      help_right.setVisible(false);
      settings_right.setVisible(false);
      contrast_right.setVisible(false);
      contact_right.setVisible(false);
      comments_right.setVisible(false);
      nice_right.setVisible(false);
      faq_right.setVisible(false);
    }


    @Override
    public void initialize(URL url, ResourceBundle rb) {

        TreeItem<String> treeItemRoot1 = new TreeItem<> ("Menu");

        TreeItem<String> nodeItemA = new TreeItem<>("File",fileicon);
        TreeItem<String> nodeItemB = new TreeItem<>("Edit",editicon);
        TreeItem<String> nodeItemC = new TreeItem<>("Windows",windowsicon);
        TreeItem<String> nodeItemD = new TreeItem<>("Tools",toolsicon);
        TreeItem<String> nodeItemE = new TreeItem<>("Help",helpicon);
        treeItemRoot1.getChildren().addAll(nodeItemA, nodeItemB, nodeItemC,nodeItemD,nodeItemE);

        nodeItemA.setExpanded(true);
        nodeItemB.setExpanded(true);
        nodeItemC.setExpanded(true);
        nodeItemD.setExpanded(true);
        nodeItemE.setExpanded(true);

        TreeItem<String> nodeItemA1 = new TreeItem<>("New File");
        TreeItem<String> nodeItemA2 = new TreeItem<>("Open");
        TreeItem<String> nodeItemA3 = new TreeItem<>("Quit");
        nodeItemA.getChildren().addAll(nodeItemA1, nodeItemA2, nodeItemA3);

        TreeItem<String> nodeItemB1 = new TreeItem<>("Edit A");
        TreeItem<String> nodeItemB2 = new TreeItem<>("Edit B");
        TreeItem<String> nodeItemB3 = new TreeItem<>("Edit C");
        TreeItem<String> nodeItemB4 = new TreeItem<>("Edit D");
        TreeItem<String> nodeItemB5 = new TreeItem<>("Edit E");
        TreeItem<String> nodeItemB6 = new TreeItem<>("Edit F");
        nodeItemB.getChildren().addAll(nodeItemB1, nodeItemB2, nodeItemB3, nodeItemB4, nodeItemB5, nodeItemB6);

        TreeItem<String> nodeItemC1 = new TreeItem<>("Windows Settings");
        TreeItem<String> nodeItemC2 = new TreeItem<>("Windows Brightness");
        TreeItem<String> nodeItemC3 = new TreeItem<>("Windows Quit");
        nodeItemC.getChildren().addAll(nodeItemC1, nodeItemC2, nodeItemC3);

        TreeItem<String> nodeItemD1 = new TreeItem<>("Settings");
        TreeItem<String> nodeItemD2 = new TreeItem<>("Print");
        nodeItemD.getChildren().addAll(nodeItemD1, nodeItemD2);

        TreeItem<String> nodeItemE1 = new TreeItem<>("Help");
        TreeItem<String> nodeItemE2 = new TreeItem<>("FAQ");
        nodeItemE.getChildren().addAll(nodeItemE1, nodeItemE2);


        TreeView<String> treeView = new TreeView<>(treeItemRoot1);
                   treeView.setShowRoot(false);
                   menuholder.getChildren().add(treeView);


//    
        treeView.getSelectionModel().selectedItemProperty().addListener( new ChangeListener() {

        public void changed(ObservableValue observable, Object oldValue,
                Object newValue) {


        operation = new Windows();
        TreeItem<String> selectedItem = (TreeItem<String>) newValue;

                         String actualmenu;
            **actualmenu = selectedItem.getValue();**


                  if (null != actualmenu) {
                      switch (actualmenu) {
                          case "File":
                              try{
                              selectedItem.setExpanded(true);
                               }
                             catch (Exception ex) {
                                  Logger.getLogger(FoablakController.class.getName()).log(Level.SEVERE, null, ex);
                                                  }
                              break;
                          case "Edit":
                              selectedItem.setExpanded(true);
                              break;
                          case "Windows":
                              selectedItem.setExpanded(true);
                              break;
                          case "Tools":
                              selectedItem.setExpanded(true);
                              break;
                          case "Help":
                              selectedItem.setExpanded(true);
                              break;
                          case "New File":
                              try {
                                  menuholder.setDisable(true);
                                  textArea_help_summary.setDisable(true);
                                  operation.first();
                              } catch (Exception ex) {
                                  Logger.getLogger(FoablakController.class.getName()).log(Level.SEVERE, null, ex);
                              }
                              break;
                          case "Open":
                              System.out.println("OK");
                              break;
                          case "Quit":
                              System.out.println("OK");
                              break;
                          case "Edit A":
                              System.out.println("OK");
                              break;
                          case "Edit B":
                              ClearScreen();
                              contrast_right.setVisible(true);
                          case "Edit C":
                              break;
                          case "Edit D":
                            System.out.println("OK");
                              break;
                          case "Edit E":
                              System.out.println("OK");
                              break;
                         }
        }
                            }

      });

            }






}
import java.net.URL;
导入java.util.ResourceBundle;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javafx.event.ActionEvent;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.application.Platform;
导入javafx.scene.layout.StackPane;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.Node;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeView;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.event.event;
导入javafx.event.EventDispatchChain;
导入javafx.event.EventDispatcher;
导入javafx.scene.control.Button;
导入javafx.scene.control.TextArea;
导入javafx.scene.input.ContextMenuEvent;
导入javafx.scene.input.KeyCode;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.input.MouseEvent;
公共类FoablakController实现可初始化{
公共窗口操作=null;
私有最终节点fileicon=新图像视图(新图像(getClass().getResourceAsStream(“file.png”));
私有最终节点editicon=newImageView(新图像(getClass().getResourceAsStream(“edit.png”));
私有最终节点windowsicon=newImageView(新图像(getClass().getResourceAsStream(“windows.png”));
私有最终节点toolsicon=newImageView(新图像(getClass().getResourceAsStream(“tools.png”));
私有最终节点helpicon=新图像视图(新图像(getClass().getResourceAsStream(“help.png”));
@FXML
公共静态堆栈窗格菜单页;
@FXML
公共静态堆栈窗格主菜单右键;
@FXML
公共静态堆栈窗格帮助_right;
@FXML
公共静态StackPane联系人(右);
@FXML
公共静态堆栈窗格设置\u右;
@FXML
公共静态堆栈窗格右对齐;
@FXML
公共静态堆栈窗格右键;
@FXML
公共静态堆栈窗格(右);
@FXML
公共静态堆栈窗格常见问题解答(右);
@FXML
公共区域概要;
@FXML
公共静态文本区文本区帮助摘要;
@FXML
公共按钮btn_打印;
@FXML
公共无效Quitgomb(ActionEvent事件){
Platform.exit();
}
公共屏幕(){
main_right.setVisible(假);
help_right.setVisible(false);
设置\右。设置可见(假);
右对比度设置可见(假);
联系人右。设置可见(假);
注释\u right.setVisible(false);
很好,设置为可见(false);
常见问题解答-右侧。设置可见(错误);
}
@凌驾
公共void初始化(URL、ResourceBundle rb){
TreeItem treeItemRoot1=新建TreeItem(“菜单”);
TreeItem nodeItemA=新的TreeItem(“文件”,fileicon);
TreeItem nodeItemB=新的TreeItem(“编辑”,编辑图标);
TreeItem nodeItemC=新的TreeItem(“Windows”,窗口图标);
TreeItem nodeItemD=新的TreeItem(“工具”,toolsicon);
TreeItem nodeItem=新的TreeItem(“帮助”,帮助图标);
treeItemRoot1.getChildren().addAll(nodeItemA、nodeItemB、nodeItemC、nodeItemD、nodeItemE);
nodeItemA.setExpanded(真);
nodeItemB.setExpanded(true);
nodeItemC.setExpanded(true);
nodeItemD.setExpanded(true);
nodeItemE.setExpanded(true);
TreeItem nodeItemA1=新的TreeItem(“新文件”);
TreeItem nodeItemA2=新的TreeItem(“打开”);
TreeItem nodeItemA3=新建TreeItem(“退出”);
nodeItemA.getChildren().addAll(nodeItemA1、nodeItemA2、nodeItemA3);
TreeItem nodeItemB1=新的TreeItem(“编辑A”);
TreeItem nodeItemB2=新的TreeItem(“编辑B”);
TreeItem nodeItemB3=新的TreeItem(“编辑C”);
TreeItem nodeItemB4=新的TreeItem(“编辑D”);
TreeItem nodeItemB5=新的TreeItem(“编辑E”);
TreeItem nodeItemB6=新的TreeItem(“编辑F”);
nodeItemB.getChildren().addAll(nodeItemB1、nodeItemB2、nodeItemB3、nodeItemB4、nodeItemB5、nodeItemB6);
TreeItem nodeItemC1=新的TreeItem(“Windows设置”);
TreeItem nodeItemC2=新的TreeItem(“窗口亮度”);
TreeItem nodeItemC3=新建TreeItem(“Windows退出”);
nodeItemC.getChildren().addAll(nodeItemC1、nodeItemC2、nodeItemC3);
TreeItem nodeItemD1=新的TreeItem(“设置”);
TreeItem nodeItemD2=新的TreeItem(“打印”);
nodeItemD.getChildren().addAll(nodeItemD1,nodeItemD2);
TreeItem nodeItemE1=新的TreeItem(“帮助”);
TreeItem nodeItemE2=新的TreeItem(“常见问题”);
nodeItemE.getChildren().addAll(nodeItemE1,nodeItemE2);
TreeView TreeView=新的TreeView(treeItemRoot1);
treeView.setShowRoot(假);
menuholder.getChildren().add(treeView);
//    
treeView.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
公共无效已更改(可观察值、可观察值、对象旧值、,
对象(新值){
手术
ChangeListener<TreeItem<String>>() {

    public void changed(ObservableValue<? extends TreeItem<String>> observable,TreeItem<String> oldValue, TreeItem<String> newValue) {          
        TreeItem<String> selectedItem;
        if(newValue != null){
            selectedItem =  newValue;
        }else{
            selectedItem =  oldValue; // here it s null so i am assigning it 
            // to the old value
        }
// add the other codes
yourTreeItem.addEventHandler(TreeItem.branchCollapsedEvent(), 
           new EventHandler<TreeModificationEvent<String>>() {

    @Override
    public void handle(TreeModificationEvent<String> event) {           
                event.getTreeItem().setExpanded(true);
            }
        });