2016-04-01 6 views
2

JavaFXでGUIを作成しようとしています。私はいくつかのデータを表示するために使用したいListViewを持っています。可能性のあるデータセットには2種類ありますが、そのうちの1つは車と自転車です。対応するボタンを押すと、必要なデータをロードします。これまでのコントローラのクラスは次のようになります。JavaFX:ObservableLists、ClassCastException:AはBにキャストできません

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXML; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.util.Callback; 


import java.util.List; 

public class FXMLController { 
    @FXML 
    ListView lv_list; 
    @FXML 
    Button button_cars; 
    @FXML 
    Button button_bikes; 


    List<Cars> cList; 
    List<Bikes> bList; 
    Server serv; 

    private ObservableList observableList = FXCollections.observableArrayList(); 

    public void initScene szene) { 
     /* initializes serv so it properly yields data */ 
    } 


    public void listAllCars() { 
     cList = serv.getAllCars(); 
     updateCarList(); 
    } 

    private void updateCarList() { 
     observableList.setAll(cList); 
     lv_list.setItems(observableList); 
     lv_list.setCellFactory(new Callback<ListView<Cars>, ListCell<Cars>>() { 
      @Override 
      public ListCell<Cars> call(ListView<Cars> listView) { 
       return new ListViewElemCars(); // creates stuff to populate the list 
      } 
     }); 
    } 

    public void listAllBikes() { 
     bList = serv.getAllBikes(); 
     updateBikeList(); 
    } 

    private void updateBikeList() { 
     observableList.setAll(bList); 
     lv_list.setItems(observableList); 
     lv_list.setCellFactory(new Callback<ListView<Bikes>, ListCell<Bikes>>() { 
      @Override 
      public ListCell<Bikes> call (ListView<Bikes> listView) { 
       return new ListViewElemBikes(); //same as with cars 
      } 
     }); 
    } 
} 

リストのメソッドは、いずれかのボタンを押すたびに発生します。メソッド自体はかなりうまくいきます。私が車のボタンを押すと、すべての車が、彼らが想定している方法で表示されます。同じバイクに行く。しかし、私は次々と押ししようとすると、私は次のエラーを取得する:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: Cars cannot be cast to Bikes 

私はそれがupdateCarList/updateBikeList方法に未チェックの呼び出しによりだと思うが、私は本当にここに途方に暮れてよ。私は何とか1つのListViewでこのようなことをやりたいのですが、ここで何が間違っているのか分かりません。私はここで何が欠けていますか?

+0

例外が発生している行に関する詳細情報を投稿できますか?たぶん、完全なスタックトレースのいくつかの行ですか? –

答えて

1

cellFactoryによって返されたセルでコンクリートタイプを使用します。 ListViewは、新しいタイプのアイテムを表示する予定のセルに新しいアイテムタイプが追加されたときに、ClassCastExceptionになるセルを再利用します。

であっても、次のアプローチが動作していないよう:

  1. クリアitemsリスト
  2. cellFactory
  3. コールrefresh()
  4. が新しいitems

にこの手段を追加、交換すべてを処理できるセルを使用する必要がありますまたはListView全体を置き換えることによって、

関連する問題