2017-08-23 91 views
0

我有两个ListView,每个都由一个单独的ArrayList填充。我试图让它在左边的ListView中双击一个项目将它复制到右边,然后双击右边的项目。每当我尝试添加一个项目时,我都会遇到一大堆错误,而且没有任何变化。去除物品的时间约为一半;这真的很奇怪,有时当我运行它时,事情将会消失得很好,而其他时候,我也会遇到大量的错误。有些代码:从ListView中删除项目出错

//Right list view 
    ListView<String> lv_right = new ListView<> 
    (FXCollections.observableArrayList(selectedSpells)); 
    lv_right.setPrefSize(175, 598); 
    lv_right.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); 


    //Double clicking in right list 
    lv_right.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      if(event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2 && 
       (event.getTarget() instanceof Labeled || ((BorderPane) event.getTarget()).getChildren().size() > 0)) { 

       //Removing items from right list 
       String item = lv_right.getSelectionModel().getSelectedItem(); 
       lv_right.getItems().remove(item); 
      }  
     } 
    }); 

我有同样的事情,现在左的ListView,与lv_left.getItems().remove(item);例外与cleric_cantrips.add(item);从未在所有工作所取代。

错误的转换:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: com.sun.javafx.scene.control.skin.LabeledText cannot be cast to javafx.scene.layout.BorderPane 
at spell_manager$1.handle(spell_manager.java:52) 
at spell_manager$1.handle(spell_manager.java:1) 
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.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:381) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416) 
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$148(WinApplication.java:191) 
at java.lang.Thread.run(Unknown Source) 

通常的垃圾一样,这意味着有一个与代码本身有问题,但我没有错误在那里,所以我想我会的情况下,任何人在这里添加此想要看到它,而不是等待有人问他们是否确实需要它。

我老实说不知道该怎么做。我还是使用JavaFX的新手......先谢谢了!

+1

你假设,如果此事件的目标不是一个标记,那么它一定是一个'BorderPane'。显然情况并非如此,你的代码正在触发一个类转换异常。这种状况应该是在做什么? (什么“我没有错误”是什么意思?) –

+0

“我没有错误”只是意味着我没有任何在编辑器中,代码运行良好,没有启动错误。至于标签和BorderPane问题,我会说实话,我不知道为什么标签位在那里。我从另一篇文章中得到了这一行,并且它很有效,呃......就像我说的,我是JavaFX的新手,我正在一起拼凑事物。 – hego64

+0

好吧,如果代码没有编译,那么你很难指望得到运行时错误。查看其他人的代码并复制它是学习的好方法,但这个想法是你应该明白它的作用。盲目复制它而不知道它在做什么不会教你任何东西。你缺少的部分是关于cast和'instanceof'运算符。我建议你阅读并理解它在原文中的用途。形式问题“我复制了一些我不明白的代码,为什么它不起作用?”在这里通常会变得很短暂。 –

回答

0

东阳当你使用||,目标不能标记borderPane在同一时间,例如当您双击标,这里的目标标记,在那之后我们转移到其他选择,你想投标记borderPane所以你需要单独写每个条件这样

lv_right.setOnMouseClicked(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 
     if(event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) 
      { 
      if(event.getTarget() instanceof Labeled) { 

      //Removing items from right list 
      String item = lv_right.getSelectionModel().getSelectedItem(); 
      lv_right.getItems().remove(item); 
     } 
      if(event.getTarget() instanceof BorderPane) { 
      BorderPane border=(BorderPane)event.getTarget; 
      if(border.getChildren().size>0) 
      { 
      //Removing items from right list 
      String item = lv_right.getSelectionModel().getSelectedItem(); 
      lv_right.getItems().remove(item); 
      } 
      }  
    } 
});