0

すでにこれと非常によく似た質問がありますが、私の質問は少し異なります。私はプロパティを使用しており、監視可能なリストで変更していますが、更新されません。元の質問はこちらです。

したがって、次のようにテーブル間で行を転送する場合:

行転送

最初の行が表示されますが、複数追加すると、次のように最初の行の後の行が更新されません。

行転送バグ

ただし、列を移動したときにのみ再表示されます。

    //Loot identification
    TableColumn lootIdentCol = new TableColumn<>("Identification");

    TableColumn<ItemDef, Integer> lootIDCol = new TableColumn<>("ID");
    lootIDCol.setCellValueFactory(
            new PropertyValueFactory<ItemDef, Integer>("id"));

    TableColumn<ItemDef, String> lootNameCol = new TableColumn<>("Name");
    lootNameCol.setCellValueFactory(
            new PropertyValueFactory<ItemDef, String>("name"));

    lootIdentCol.getColumns().addAll(lootNameCol, lootIDCol);

    //Loot price
    TableColumn<ItemDef, Integer> lootPriceCol = new TableColumn<>("Price");
    lootPriceCol.setCellValueFactory(
            new PropertyValueFactory<ItemDef, Integer>("price"));

    //To loot items table
    toLootItemsTableView.getColumns().addAll(lootIdentCol, lootPriceCol);
    grid.add(toLootItemsTableView, 0, 1);

    //Lootable items table
    lootableItemsTableView.getColumns().addAll(lootIdentCol, lootPriceCol);
    grid.add(lootableItemsTableView, 2, 1);

    toLootItemsTableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    lootableItemsTableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    lootableItemsTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    toLootItemsTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

    lootableTableList.add(new ItemDef("Ab", 141, false, false));
    lootableTableList.add(new ItemDef("Ac", 25, false, false));
    lootableTableList.add(new ItemDef("AD", 262, false, false));

    AddRemoveButtons<ItemDef> addRemoveLootButtons = new AddRemoveButtons<>(
            lootableTableList, lootableItemsTableView.getSelectionModel(),
            toLootTableList, toLootItemsTableView.getSelectionModel()
    );

AddRemoveButtons のコード:

private final ObservableList<E> fromList;
private final ObservableList<E> toList;

public AddRemoveButtons(final ObservableList<E> fromList, final SelectionModel<E> from,
                        final ObservableList<E> toList, final SelectionModel<E> to) {
    this.fromList = fromList;
    this.toList = toList;

    setAlignment(Pos.CENTER);
    setPadding(new Insets(5, 5, 5, 5));
    setSpacing(15);

    ObservableList<Node> children = getChildren();

    Button moveInto = new Button("Add");
    moveInto.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            if (from instanceof MultipleSelectionModel) {
                MultipleSelectionModel<E> multipleFrom = (MultipleSelectionModel<E>) from;
                ObservableList<Integer> selectedIndices = multipleFrom.getSelectedIndices();
                for (int i : selectedIndices)
                    transfer(i, true);
            } else
                transfer(from.getSelectedIndex(), true);
        }
    });

    Button delete = new Button("Del");
    delete.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            if (to instanceof MultipleSelectionModel) {
                MultipleSelectionModel<E> multipleFrom = (MultipleSelectionModel<E>) to;
                ObservableList<Integer> selectedIndices = multipleFrom.getSelectedIndices();
                for (int i : selectedIndices)
                    transfer(i, false);
            } else
                transfer(to.getSelectedIndex(), false);
        }
    });

    children.addAll(moveInto, delete);
}

private void transfer(int index, boolean forward) {
    if (forward)
        toList.add(fromList.remove(index));
    else
        fromList.add(toList.remove(index));
}

Identifiable、Serializable、Comparable を実装する ItemDef:

private final String  name;
private final int     id;
private final boolean members;
private final boolean stackable;
private       int     price;

public ItemDef(JSONObject jsonObject) {
    this(
            (String) jsonObject.get("name"),
            Integer.parseInt((String) jsonObject.get("id")),
            Boolean.parseBoolean((String) jsonObject.get("members")),
            Boolean.parseBoolean((String) jsonObject.get("stackable"))
    );
}

public ItemDef(String name, int id, boolean members, boolean stackable) {
    this.name = name;
    this.id = id;
    this.members = members;
    this.stackable = stackable;
    price = -1;
}

public String getName() {
    return name;
}

@Override
public int getId() {
    return id;
}

public boolean isMembers() {
    return members;
}

public boolean isStackable() {
    return stackable;
}

public int getPrice() {
    return price != -1 ? price : updatePrice();
}

//Other methods not relevant
4

2 に答える 2

2

なぜそれをやり続けたのかを理解しました。

複数のテーブルで同じ TableColumn を参照することはできません。

于 2013-05-26T00:04:07.963 に答える
0

複数のテーブルでデータを更新して、列ではなくデータセットを共有する場合は、複数のテーブルで列を共有しないでください。

于 2013-06-21T15:49:24.550 に答える