2017-08-23 90 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); 
      } 
      }  
    } 
});