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