2016-09-17 8 views
1

私はそれに接続されているobservableListとリストビューを持っているに添加した場合にのJavaFXリストビューの重複は、observableList

@FXML 
private ListView<Weapon> listViewWeapons; 

    .... 
    //initialize 
    listViewWeapons.setCellFactory(lv -> new CustomWeaponDetailListCell<>()); 
    listViewWeapons.setItems(CsgoRr.getModel().getWeaponCache()); 

カスタムセル:新しい武器を作成し、それを追加するための

public class CustomWeaponDetailListCell<T extends Weapon> extends ListCell<T> { 

    private final StringBuilder sb = new StringBuilder(); 

    @Override 
    public void updateItem(T item, boolean empty) { 
     super.updateItem(item, empty); 
     if (empty) { 
      setText(null); 
     } else { 
      sb.append(item.getName()).append(" Detail:") 
        .append((String) CsgoRr.objectToJsonString(item.getRecoilPattern())); 

      setText(sb.toString()); 
     } 
    } 
} 

機能データベースとリスト:

private static int newWeaponNameIncrement = 1; 

@FXML 
private void newWeaponOnAction() { 
    try { 
     System.out.println("DEBUG WEAPON NAME TRYING TO BE CREATED IS :" + "newWeapon" + newWeaponNameIncrement); 
     Weapon newWeapon = Weapon.createWeapon("newWeapon" + newWeaponNameIncrement, 
       new RecoilPattern()); 
     newWeapon.setId(DbUtil.storeWeapon(newWeapon)); 

     CsgoRr.getModel().getWeaponCache().add(newWeapon); 
    } catch (SQLException ex) { 
     if (ex.getErrorCode() == 23505) {//duplicate name 
      System.out.println("DEBUG :Duplicate name on add new weapon"); 
      newWeaponNameIncrement++; 
      newWeaponOnAction(); 
     } 

     Logger.getLogger(WeaponViewController.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (AWTException ex) { 
     Logger.getLogger(WeaponViewController.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

すべて正常に動作し、データはデータベースに追加されます。bこの問題はもう一度listViewがどのように振る舞うかで問題になります。here in a GIF(GIFのサイズが大きすぎます。リンクをクリックする必要があります。ここに埋め込むことはできません)。

イメージからわかるように、問題はリスト内の項目を少なくとも視覚的に複製するため、変更は更新されますが、適切な方法ではありません。ビューを別のものに変更してから、コンストラクタを呼び出してメソッドを初期化した後に戻ると、すべてが見えるようになります。誰でもこの問題が何であるかを知っていますか?

奇妙な部分は私の問題を解決し、完璧に動作する私の以前のSOの質問を指している他のコントローラに似たようなコードを持っています。 JavaFX ListView adding item into observable list doesn't reflect change and it's not selectable 私はフィードバックがありませんでしたが、以前はフィードバックがありましたが、正しいものはありませんでしたので、別の問題です。

答えて

2

アイテムを交換せずに交換するたびに同じStringBuilderを再使用します。つまり、Stringは、Cellに格納されたアイテムのすべての値の連結になります。

あなたは異なるStringBuilder秒ごとに時間を使うか、StringBuilderをクリアする必要があります。

public class CustomWeaponDetailListCell<T extends Weapon> extends ListCell<T> { 

    private final StringBuilder sb = new StringBuilder(); 

    @Override 
    public void updateItem(T item, boolean empty) { 
     super.updateItem(item, empty); 
     if (empty) { 
      setText(null); 
     } else { 
      sb.append(item.getName()).append(" Detail:") 
        .append((String) CsgoRr.objectToJsonString(item.getRecoilPattern())); 

      setText(sb.toString()); 

      // clear StringBuilder content 
      sb.delete(0, sb.length()); 
     } 
    } 
} 
+0

オハイオ州私の神、私はここの横にどこでも探しているので、ダム感じる:D、完全にそれをクリアするのを忘れて、それに気付いてくれてありがとう。 –

関連する問題