JavaFX TableView не обновляется? - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу заменить старые данные новыми введенными отредактированными данными в tableView. Столбец 2 работает, а столбец 1 - нет.Я обнаружил, что ключ entrySet () изменяется, но ключ в tableView не меняется! Я наблюдаю entrySet hashmap, поэтому я ожидаю, что таблица будет обновляться автоматически при удалении или добавлении записи.Это предположение неверно?

import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.util.converter.IntegerStringConverter;

import java.util.Map;

public class EnumerateTable {
 private ObservableList<Map.Entry<Integer, String>> items;


private TableView<Map.Entry<Integer,String>> table;
public EnumerateTable( Enumerator x) {







    TableColumn<Map.Entry<Integer, String>, Integer> column1 = new TableColumn<>("Key");
    column1.setCellValueFactory(p ->new SimpleIntegerProperty(p.getValue().getKey()).asObject());

    TableColumn<Map.Entry<Integer, String>, String> column2 = new TableColumn<>("Value");
    column2.setCellValueFactory(p -> new SimpleStringProperty(p.getValue().getValue()));

    items = FXCollections.observableArrayList(x.enums.entrySet());



    table = new TableView<>(items);
     table.setEditable(true);
     column1.setEditable(true);
    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    table.getColumns().setAll(column1, column2);
    column1.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter()));
    column1.setOnEditCommit(
            t -> {
                String value = t.getTableView().getItems().get(
                        t.getTablePosition().getRow()).getValue();
                int key = t.getTableView().getItems().get(
                        t.getTablePosition().getRow()).getKey();
                System.out.println(key+" key");
                System.out.println(x.enums.entrySet()+"    before");
                x.getEnums().remove(key);
                x.getEnums().put(t.getNewValue(),value);
                System.out.println(t.getNewValue()+"   new value");
                System.out.println(x.getEnums().entrySet()+"    after");
                table.refresh();






            });
    column2.setCellFactory(TextFieldTableCell.forTableColumn());
    column2.setOnEditCommit(
            t -> {
                int key= t.getTableView().getItems().get(t.getTablePosition().getRow()).getKey();

                System.out.println(x.getEnums().size());
                x.getEnums().put(key,t.getNewValue());
                System.out.println(x.getEnums().size());
            });


}



public TableView<Map.Entry<Integer, String>> getTable() {
    return table;
}

}

Метод getEnums () происходит от

import java.util.HashMap;

public class Enumerator {
String name;
HashMap<Integer,String> enums;


public Enumerator(String name)
{   this.name = name;
    enums = new HashMap<>();}

public HashMap<Integer, String> getEnums() {
    return enums;
}
}

1 Ответ

0 голосов
/ 16 ноября 2018

Я наблюдаю запись набора хэш-карт

Нет, вы ничего не наблюдаете.На самом деле HashMap не предоставляет никаких функций, позволяющих наблюдать за изменениями.

FXCollections.observableArrayList(x.enums.entrySet());

Просто создает новый ObservableList и копирует содержимое из Collection, переданного в качестве параметра в этот список.После добавления или удаления ключей с карты записи больше не гарантированно работают, но нет уведомлений об обновлениях и ObservableList не обновляется, если ключи на карте меняются.

Я рекомендую использоватьвместо этого используйте ключи TableView и обновите карту и список элементов в событии onEditCommit для первого столбца.

@Override
public void start(Stage primaryStage) {
    Map<Integer, String> map = new HashMap<>();
    map.put(1, "foo");
    map.put(23, "bar");

    ObservableList<Integer> keys = FXCollections.observableArrayList(map.keySet());

    TableView<Integer> table = new TableView<>(keys);

    TableColumn<Integer, Integer> column1 = new TableColumn<>("Key");
    column1.setCellValueFactory(p -> new SimpleObjectProperty<>(p.getValue()));

    TableColumn<Integer, String> column2 = new TableColumn<>("Value");
    column2.setCellValueFactory(p -> new SimpleStringProperty(map.get(p.getValue())));

    table.setEditable(true);
    column1.setEditable(true);
    table.getColumns().setAll(column1, column2);

    column1.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter()));
    column1.setOnEditCommit(t -> {
        Integer key = t.getRowValue();
        Integer newKey = t.getNewValue();
        if (!key.equals(newKey)) {
            if (map.containsKey(newKey)) {
                // make sure this cell's value remains unmodified
                table.refresh();
            } else {
                int rowIndex = t.getTablePosition().getRow();
                map.put(newKey, map.remove(key));
                keys.set(rowIndex, newKey);
            }
        }
    });
    column2.setCellFactory(TextFieldTableCell.forTableColumn());
    column2.setOnEditCommit(t -> {
        Integer key = t.getRowValue();
        map.put(key, t.getNewValue());
    });

    Scene scene = new Scene(table);

    primaryStage.setScene(scene);
    primaryStage.show();
}

Обратите внимание, что приведенный выше код работает только до тех пор, пока вы не нажметене изменяйте данные карты другим способом.Если вы измените карту каким-либо другим способом, вы должны быть уверены, что обновите список keys и обязательно вызовите table.refresh(), если вы измените значение.

(В этом случае этоможет быть лучше использовать ObservableMap вместо HashMap, который позволяет вам добавить прослушиватель, который обновляет список.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...