私はそれに接続されている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 私はフィードバックがありませんでしたが、以前はフィードバックがありましたが、正しいものはありませんでしたので、別の問題です。
オハイオ州私の神、私はここの横にどこでも探しているので、ダム感じる:D、完全にそれをクリアするのを忘れて、それに気付いてくれてありがとう。 –